# 题目描述

题目链接

This time, you are supposed to find A×BA\times B where AA and BB are two polynomials.

# Input Specification:

Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial:

KN1aN1N2aN2...NKaNKK N_1 a_{N_1} N_2 a_{N_2}...N_Ka_{N_K} where KK is the number of nonzero terms in the polynomial, NiN_i and aNi(i=1,2,,K)a_{N_i}(i=1,2,\cdots ,K) are the exponents and coefficients, respectively. It is given that 1K10,0NK<<N2<N110001≤K≤10, 0≤N_K<⋯< N_2< N_1≤1000.

# Output Specification:

For each test case you should output the product of AA and BB in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate to 1 decimal place.

# Sample Input:

2 1 2.4 0 3.2
2 2 1.5 1 0.5

# Sample Output:

3 3 3.6 2 6.0 1 1.6

# 解释

给出两个关于 x 的多项式,计算它们的积。多项式的表示形式为:首先是项数,然后依次的整型和浮点数表示指数和系数,按指数从大向小排列。

# 一种思路

建立两个整型到浮点数的 map,一个用于存放第一个多项式,另一个用于存放结果。整型相当于指数,浮点数相当于系数。那么之后相乘的时候只需要遍历第一个 map 然后直接求积即可。最后利用 map 的键自动排序的特点,倒序输出即可。这里注意系数为 0 的项表示不存在,不要输出。

第一次用 rbegin 和 rend,以为要用指针–,后来才发现还是用指针 ++ 的形式。

以及,find 函数找不到的时候返回的是 end

以及,map 添加键值对的时候使用 make_pair 函数就行

# 解答

#include<bits/stdc++.h>
using namespace std;
int main(){
    map<int, double> a,b;
    int K, exp;
    double coe;
    cin >> K;
    for (int i = 0 ; i < K ; i++) {
        cin >> exp >> coe;
        a.insert(make_pair(exp,coe));
    }
    cin >> K;
    for (int i = 0; i < K; i++){
        cin >> exp >> coe;
        for (auto pair : a){
            auto item = make_pair(pair.first+exp,pair.second*coe);
            if (b.find(item.first)==b.end()){
                b.insert(item);
            } else {
                b[item.first] += item.second;
            }
        }
    }
    int cnt = 0;
    for (auto i : b)
    {
        if (i.second != 0)
            cnt++;
    }
    cout << cnt;
    for (auto i = b.rbegin(); i != b.rend(); i++)
    {
        if(i->second != 0.0)
            printf(" %d %.1f",i->first,i->second);
    }
    return 0;
}