链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
Etéreo 吃完了元宵,又开始思考数学问题了。这次他拿了两个多项式 P\mathscr{P}P 和 Q\mathscr{Q}Q 。他知道这两个多项式的乘积也是一个多项式,但他不清楚每一项的系数。所以他又来请问你咯。
输入描述:
输入共三行。 第一行两个整数 n,m 表示多项式 p1 的最高次项次数n和p2最高次项次数m。 第二行 n+1 个整数,表示多项式 p1 的每一项的系数。按次数从小到大的顺序排列。 第三行 m+1 个整数,表示多项式 p2 的每一项的系数。按次数从小到大的顺序排列。
输出描述:
输出共一行,n+m+1 个整数,表示乘积多项式的每一项的系数。按次数从小到大排列。
示例1
输入
2 3 2 1 3 1 2 0 2
2 3 2 1 3 1 2 0 2
输出
2 5 5 10 2 6
2 5 5 10 2 6
说明
(3x2+x+2)×(2x3+2x+1)=(6x5+2x4+10x3+5x2+5x+2)(3x^2 + x + 2) (2x^3 + 2x + 1) = (6x^5 + 2x^4 + 10x^3 + 5x^2 + 5x + 2)(3x2+x+2)×(2x3+2x+1)=(6x5+2x4+10x3+5x2+5x+2)
备注:
1≤n,m≤500 −100≤−100≤ 系数 ≤100≤100
思路:
该题我们可以使用map来做这道题。在输入的处理上,我们使用两个map(p1,p2)来储存数据。Key值(第一个关键字)来存次方,value值(第二个关键字)来存系数。两个多项式相乘,那么我们就按照数学方法来做题,遍历相乘。即遍历p1,p2,让它俩相乘,在使用一个map(p)来存相乘的结果,多项式相乘,系数相乘,指数相加,即p的key等于p1,p2的key相加,p的value值等于p1,p1的value想乘。因为防止相乘后又指数相同,我们需要合并同类项。即使用+=。该题需要按照指数从小到大输出。Map有自动排序,(按照key值从小到大排序).
Key值又是指数,直接遍历输出即可。
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
map<int,int> p1,p2,p;//建立三个map,后续方便处理输入和输出。
int n,x,y,m;
cin>>n>>m;
for(int i=0;i<=n;i++){
cin>>x;
p1[i]+=x;//key值作为指数,value作为系数。
}
for(int i=0;i<=m;i++){
cin>>x;
p2[i]+=x;//key值作为指数,value作为系数。
}
for(auto it=p1.begin();it!=p1.end();it++){
for(auto t=p2.begin();t!=p2.end();t++){
p[it->first+t->first]+=it->second*t->second;//多项式相乘,指数相加,系数相乘。
}
}
for(auto it: p)
cout<<it.second<<" ";//遍历输出即可。
return 0;
}