链接:https://ac.nowcoder.com/acm/contest/85/D
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
Etéreo 吃完了元宵,又开始思考数学问题了。这次他拿了两个多项式 P\mathscr{P}P 和 Q\mathscr{Q}Q 。他知道这两个多项式的乘积也是一个多项式,但他不清楚每一项的系数。所以他又来请问你咯。
输入描述:
输入共三行。 第一行两个整数 n,mn, mn,m ,表示多项式 P\mathscr{P}P 的最高次项次数 nnn 和 Q\mathscr{Q}Q 的最高次项次数 mmm 。 第二行 n+1n+1n+1 个整数,表示多项式 P\mathscr{P}P 的每一项的系数。按次数从小到大的顺序排列。 第三行 m+1m+1m+1 个整数,表示多项式 Q\mathscr{Q}Q 的每一项的系数。按次数从小到大的顺序排列。
输出描述:
输出共一行,n+m+1n+m+1n+m+1 个整数,表示乘积多项式的每一项的系数。按次数从小到大排列。
示例1
输入
2 3 2 1 3 1 2 0 2
输出
2 5 5 10 2 6
说明
(3x2+x+2)×(2x3+2x+1)=(6x5+2x4+10x3+5x2+5x+2)(3x^2 + x + 2) \times (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≤5001 \leq n, m \leq 5001≤n,m≤500 −100≤-100 \leq−100≤ 系数 ≤100\leq 100≤100
题解:
本来想着有没有啥公式规律啥的可以直接求出来的,后来发现根本没有公式,解法就是平时我们数学上算多项式乘法的方法,只不过用C++实现显得更简便些而已。
首先定义a、b数组,存两个多项式,然后定义c数组保存结果,注意c数组的大小是a、b数组大小的相加。用数组下标来表示某一项的幂,结果中相同的幂相加。
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
int a[505],b[505],c[2000];
int main(){
std::ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
for(int i=0;i<n+1;i++) cin>>a[i];
for(int i=0;i<m+1;i++) cin>>b[i];
for(int i=0;i<n+1;i++)
for(int j=0;j<m+1;j++)
c[i+j]+=a[i]*b[j];
cout<<c[0];
for(int i=1;i<n+m+1;i++) cout<<" "<<c[i];
return 0;
}