设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0
。
输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
结尾无空行
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
结尾无空行
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int,int> node;
vector<node> a,b;
vector<node> Add(vector<node> a,vector<node> b)
{
vector<node> add;
int i,j;
for(i=0,j=0; i<a.size() && j<b.size(); ) // 相加
{
if(a[i].y > b[j].y) // a次方更大
{
add.push_back(a[i++]);
}
else if(a[i].y < b[j].y)
{
add.push_back(b[j++]);
}
else // 相等
{
node t=make_pair(a[i].x+b[j].x,a[i].y);
i++;
j++;
if(t.x != 0)
{
add.push_back(t);
}
}
}
while(i < a.size())
{
add.push_back(a[i++]);
}
while(j < b.size())
{
add.push_back(b[j++]);
}
return add;
}
vector<node> Mul(vector<node> a,vector<node> b)
{
int i,j;
vector<node>mul;
for(i=0; i<a.size(); i++)
{
vector<node>t=b;
for(j=0; j<t.size(); j++)
{
t[j].x*=a[i].x;
t[j].y+=a[i].y;
}
mul=Add(mul,t);
}
return mul;
}
int main()
{
// system("chcp 65001");
cin.tie(0);
cout.tie(0);
// freopen("C:/Users/zhaochen/Desktop/input.txt", "r", stdin);
int i,j,sizea,sizeb;
cin>>sizea;
for(i=0; i<sizea; i++)
{
node t;
cin>>t.x>>t.y;
a.push_back(t);
}
cin>>sizeb;
for(i=0; i<sizeb; i++)
{
node t;
cin>>t.x>>t.y;
b.push_back(t);
}
vector<node> mul=Mul(a,b);
if(mul.size()==0)
{
cout<< 0<< " "<< 0;
}
else
{
cout<< mul[0].x<< " "<< mul[0].y;
for(i=1; i<mul.size(); i++)
{
cout<< " "<< mul[i].x<< " "<< mul[i].y;
}
}
cout<< endl;
vector<node> add=Add(a,b);
if(add.size()==0)
{
cout<< 0<< " "<<0;
}
else
{
cout<< add[0].x<< " "<< add[0].y;
for(i=1; i<add.size(); i++)
{
cout<< " "<< add[i].x<< " "<< add[i].y;
}
}
return 0;
}