设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
代码长度限制
16 KB
时间限制
200 ms
内存限制
64 MB
这题一开始没仔细想,后来看别人博客会了;
第一个是样例改数值
第二个合并同类项有消除
第三个结果有0多项式
第四个是输入0多项式和常数!!!
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define IOS ios::sync_with_stdio(false);
#define int long long
vector<int>a,b;
vector<pair<int ,int>>jh,cj;
map<int,int>mp1,mp2;
bool cmp(pair<int ,int>a,pair<int ,int>b) {
if(a.second!=b.second) {
return a.second>b.second;
}
}
signed main() {
int n;
cin>>n;
for(int i=0; i<n; i++) {
int tmp;
cin>>tmp;
a.pb(tmp);
cin>>tmp;
a.pb(tmp);
}
cin>>n;
for(int i=0; i<n; i++) {
int tmp;
cin>>tmp;
b.pb(tmp);
cin>>tmp;
b.pb(tmp);
}
if(!a.empty()&&!b.empty()) {
for(int i=0; i<a.size(); i+=2) {
mp1[a[i+1]]+=a[i];
}
for(int i=0; i<b.size(); i+=2) {
mp1[b[i+1]]+=b[i];
}
for(int i=0; i<a.size(); i+=2) {
for(int j=0; j<b.size(); j+=2) {
mp2[a[i+1]+b[j+1]]+=a[i]*b[j];
}
}
for(auto i:mp1) {
if(i.second!=0)jh.pb({i.second,i.first});
}
for(auto i:mp2) {
if(i.second!=0)cj.pb({i.second,i.first});
}
sort(jh.begin(),jh.end(),cmp);
sort(cj.begin(),cj.end(),cmp);
if(!cj.empty()) {
for(int i=0; i<cj.size(); i++) {
cout<<cj[i].first<<" "<<cj[i].second<<(i==cj.size()-1?"\n":" ");
}
} else {
cout<<"0 0"<<endl;
}
if(!jh.empty()) {
for(int i=0; i<jh.size(); i++) {
cout<<jh[i].first<<" "<<jh[i].second<<(i==jh.size()-1?"\n":" ");
}
} else {
cout<<"0 0"<<endl;
}
} else if(a.empty()&&b.empty()) {
cout<<"0 0"<<endl;
cout<<"0 0"<<endl;
} else {
if(!a.empty()) {
cout<<"0 0"<<endl;
for(int i=0; i<a.size(); i++) {
cout<<a[i]<<(i==a.size()-1?"\n":" ");
}
} else {
cout<<"0 0"<<endl;
for(int i=0; i<b.size(); i++) {
cout<<b[i]<<(i==b.size()-1?"\n":" ");
}
}
}
return 0;
}