这是一道模板题。

给你两个多项式,请输出乘起来后的多项式。

输入格式

第一行两个整数 \(n\) 和 \(m\) ,分别表示两个多项式的次数。

第二行 \(n+1\) 个整数,表示第一个多项式的 \(0\) 到 \(n\) 次项系数。

第三行 \(m+1\) 个整数,表示第二个多项式的 \(0\) 到 \(m\) 次项系数。

输出格式

一行 \(n+m+1\) 个整数,表示乘起来后的多项式的 \(0\) 到 \(n+m\) 次项系数。

样例一

input

1 2

1 2

1 2 1

output

1 4 5 2

explanation

\((1 + 2x) \cdot (1 + 2x + x^2) = 1 + 4x + 5x^2 + 2x^3\)

限制与约定

\(0 \leq n, m \leq 10^5\),保证输入中的系数大于等于 \(0\) 且小于等于 \(9\) 。

时间限制:1s

空间限制:256MB

题解

迟来的FFT,用的迭代版,更快一些

Menci的博客写得很好

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=1<<21;
const db Pi=acos(-1.0);
int n1,n2,n,m,rev[MAXN],cnt;
struct Complex{
db real,imag;
inline Complex operator + (const Complex &A){
return (Complex){real+A.real,imag+A.imag};
};
inline Complex operator - (const Complex &A){
return (Complex){real-A.real,imag-A.imag};
};
inline Complex operator * (const Complex &A){
return (Complex){real*A.real-imag*A.imag,imag*A.real+real*A.imag};
};
};
Complex a[MAXN],b[MAXN];
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline void FFT(Complex *A,int tp)
{
for(register int i=0;i<n;++i)
if(i<rev[i])std::swap(A[i],A[rev[i]]);
for(register int l=2;l<=n;l<<=1)
{
Complex wn=(Complex){cos(2*Pi/l),sin(tp*2*Pi/l)};
for(register int i=0;i<n;i+=l)
{
Complex w=(Complex){1,0};
for(register int j=0;j<(l>>1);++j)
{
Complex A1=A[i+j],A2=A[i+j+(l>>1)]*w;
A[i+j]=A1+A2;A[i+j+(l>>1)]=A1-A2;
w=w*wn;
}
}
}
}
int main()
{
read(n1);read(n2);
n1++;n2++;m=n1+n2-1;
for(register int i=0;i<n1;++i)scanf("%lf",&a[i].real);
for(register int i=0;i<n2;++i)scanf("%lf",&b[i].real);
for(n=1;n<m;n<<=1)++cnt;
for(register int i=0;i<n;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<(cnt-1));
FFT(a,1);FFT(b,1);
for(register int i=0;i<=n;++i)a[i]=a[i]*b[i];
FFT(a,-1);
for(register int i=0;i<m;++i)write((int)(a[i].real/n+0.5),' ');
puts("");
return 0;
}

最新文章

  1. uicode编码解码
  2. php 异常处理类
  3. COGS 2188. [HZOI 2015] Math 题解
  4. C语言实现二叉树-01版
  5. iOS CoreData学习资料 和 问题
  6. String类的使用 Part2
  7. HDU 4608 I-number(模拟)
  8. Serializable序列化
  9. PHP系列笔记——Zend_Controller工作流程
  10. D. Bear and Two Paths(贪心构造)
  11. DOM2练习
  12. property--staticmethod--classmethod
  13. FSharp 调用 Oracle.ManagedDataAccess.dll
  14. linux 搭建CA服务器 http+ssl mail+ssl 扫描与抓包
  15. Guava Cache探索及spring项目整合GuavaCache实例
  16. 第11章 AOF持久化
  17. HDU 6228 - Tree - [DFS]
  18. 内存池、进程池、线程池介绍及线程池C++实现
  19. 模仿QQ 之弹出菜单
  20. nginx配置文件结构,语法,配置命令解释

热门文章

  1. Express 总结
  2. Awesome Flask
  3. 探索 Flask
  4. hugepages_settings.sh
  5. 读google c++规范笔记
  6. WeTest功能优化第2期:云真机智能投屏,调试告别鼠标
  7. HTML&#160;常见的 DOCTYPE 声明
  8. python+selenium 环境配置
  9. Selenium自动化测试第二天(下)
  10. scatter注记词2