多项式乘法

链接: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;
}
原创文章 99 获赞 15 访问量 7361

猜你喜欢

转载自blog.csdn.net/qq_45328552/article/details/100837300