1009 多项式乘积
这次,你应该求出多项式A和B的乘积(A*B)
输入规范
每个输入文件包含一个测试用例。每个测试用例占行,每行包含一个多项式的信息:
K N1 aN1 N2 aN2 … NK aNK
其中K表示多项式中非零项的个数,Ni和aNi(i = 1, 2, 3, …, K)分别表示指数和系数。它们的范围位1 <= K <= 10, 0 <= NK < … < N2 < N1 <= 1000。
输出规范
对于每个测试用例,你应该按照输入的格式在一行中输出A和B的乘积。注意一行的末尾没有多余的空格。请保留小数点后一位。
输入样例
2 1 2.4 0 3.2
2 2 1.5 1 0.5
输出样例
3 3 3.6 2 6.0 1 1.6
解题思路
模拟多项式计算过程。需要注意的是给定的多项式指数不超过1000,但是求解A*B时指数相加,答案应该时不超过2000。所以开答案数组应该开到2000大小。
AC代码
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 1005;
pair<int, double> p[MAXN]; //保存第一个多项式
double res[MAXN]; //保存答案,res[i]表示系数为i的指数
int main() {
//输入第一个多项式
int k1;
cin >> k1;
for(int i = 0; i < k1; i++) {
cin >> p[i].first >> p[i].second;
}
//输入第二个多项式
int k2;
cin >> k2;
for(int i = 0; i < k2; i++) {
int n;
double a;
cin >> n >> a;
//求解
for(int j = 0; j < k1; j++) {
res[p[j].first+n] += a * p[j].second;
}
}
int cnt = 0;
for(int i = 0; i < MAXN; i++) {
if(res[i] != 0) {
cnt++;
}
}
if(!cnt) {
cout << cnt << endl;
}else {
cout << cnt;
for(int i = MAXN - 1; i >= 0; i--) {
if(res[i] != 0) {
printf(" %d %.1lf", i, res[i]);
}
}
cout << endl;
}
return 0;
}