题目背景

这是一道FFT模板题

题目描述

给定一个n次多项式F(x),和一个m次多项式G(x)。

请求出F(x)和G(x)的卷积。

输入输出格式

输入格式:

第一行2个正整数n,m。

接下来一行n+1个数字,从低到高表示F(x)的系数。

接下来一行m+1个数字,从低到高表示G(x))的系数。

输出格式:

一行n+m+1个数字,从低到高表示F(x)∗G(x)的系数。

输入输出样例

输入样例#1:

1 2
1 2
1 2 1
输出样例#1:

1 4 5 2

说明

保证输入中的系数大于等于 0 且小于等于9。

对于100%的数据: n, m \leq {10}^6n,m≤106, 共计20个数据点,2s。

数据有一定梯度。

空间限制:256MB

NTT和FFT有惊人的类似度hhh,总的说就是把单位根换成了原根。

最好是取一个形如p=k*2^x+1这样的质数p,这里x最好大一点。

然后在FFT里1的K次单位根是(cos(2*π/K),sin(2*π/K))  (一个复数),而NTT里则是 g^((p-1)/K)。

dft的逆函数的话也类似,就是把g换成g^-1。

#include<bits/stdc++.h>
#define ll long long
#define maxn 3000005
#define ha 998244353
using namespace std;
const int ba=;
const int ni=ha/ba+; inline int add(int x,int y){
x+=y;
if(x>=ha) x-=ha;
return x;
} inline int dec(int x,int y){
x-=y;
if(x<) x+=ha;
return x;
} inline int ksm(int x,int y){
int an=;
for(;y;y>>=,x=(ll)x*x%ha) if(y&) an=(ll)an*x%ha;
return an;
} int n,m,a[maxn],b[maxn];
int r[maxn],l,inv; inline void fft(int *c,int f){
for(int i=;i<n;i++) if(i<r[i]) swap(c[i],c[r[i]]); for(int i=;i<n;i<<=){
int omega=(f==?ksm(ba,(ha-)/(i<<)):ksm(ni,(ha-)/(i<<)));
for(int j=,p=i<<;j<n;j+=p){
int now=;
for(int k=;k<i;k++,now=(ll)now*omega%ha){
int x=c[j+k],y=(ll)now*c[j+k+i]%ha;
c[j+k]=add(x,y);
c[j+k+i]=dec(x,y);
}
}
} if(f==-) for(int i=;i<n;i++) c[i]=(ll)c[i]*inv%ha;
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",a+i);
for(int i=;i<=m;i++) scanf("%d",b+i); m+=n;
for(n=,l=;n<=m;n<<=) l++;
for(int i=;i<n;i++) r[i]=(r[i>>]>>)|((i&)<<(l-));
inv=ksm(n,ha-); fft(a,),fft(b,);
for(int i=;i<n;i++) a[i]=(ll)a[i]*b[i]%ha;
fft(a,-);
for(int i=;i<=m;i++) printf("%d ",a[i]);
puts("");
return ;
}

最新文章

  1. 逻辑运算符&amp;&amp;和&amp;的区别 ||和|的区别
  2. 用 GitHub 来部署静态网页 ꒰・◡・๑꒱
  3. .NET清除Session 的几个方法[clear/removeAll/remove/Abandon]
  4. IOS键盘收起
  5. Android Java 与 C++ 恒调用,路径、文件名、延长的最大长度
  6. RF1001: 各浏览器对 &#39;@font-face&#39; 规则支持的字体格式不同,IE 支持 EOT 字体,Firefox Safari Opera 支持 TrueType 等字体
  7. Struts框架的国际化
  8. Springboot2.0(Spring5.0)中个性化配置项目上的细节差异
  9. 编写程序,将来自文件中的行保存在一个vector&lt;string&gt;,然后使用一个istringstream 从vector中读取数据,每次读一个单词
  10. linux下进程绑定cpu情况查看的几种方法
  11. html复习小结
  12. 2018/04/24 PHP 设计模式之注册树模式
  13. 【K8S学习笔记】Part1:使用端口转发访问集群内的应用
  14. 被误解的 Node.js
  15. protobuf 语法简介
  16. 用js实现table内容从下到上连续滚动
  17. CAS-认证流程
  18. led不同颜色的驱动电压和驱动电流
  19. leetCode题解之反转二叉树
  20. Linux 系统的/etc目录

热门文章

  1. 【BZOJ 3232】圈地游戏 二分+SPFA判环/最小割经典模型
  2. 使用fuser查询文件、目录、socket端口的占用进程
  3. Extend the size of ext3 partition online in VM
  4. Drac6-Web界面无法访问
  5. JVM 性能排查--汇总
  6. Bzoj1313 [HAOI2008]下落的圆盘
  7. [BZOJ2243][SDOI2011]染色 解题报告|树链剖分
  8. The service base of EF I am using
  9. popen &amp;&amp; pclose函数
  10. arm处理器中a5 a8 a9,v6 v7,arm7 arm9 arm11都是依据什么来分类的【转】