题目描述
给定一个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≤106
数据有一定梯度。
空间限制:256MB

//FFT
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
using namespace std;
int n, m;
const double Pi = acos(-1.0);
struct complex{double x,y;complex (double xx=0,double yy=0){x=xx,y=yy;}
};
complex operator + (complex a,complex b){ return complex(a.x+b.x , a.y+b.y);}
complex operator - (complex a,complex b){ return complex(a.x-b.x , a.y-b.y);}
complex operator * (complex a,complex b){ return complex(a.x*b.x-a.y*b.y , a.x*b.y+a.y*b.x);}
vector<complex>a, b;
inline int getnum(){int x = 0, f = 1;char ch = getchar();while (ch < '0' || ch > '9') {if (ch == '-') f = -1; ch = getchar();}while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}return x * f;
}
void get_read(){n = getnum(); m = getnum();for (int i = 0; i <= n; ++i) a.push_back(complex(getnum(), 0));for (int i = 0; i <= m; ++i) b.push_back(complex(getnum(), 0));
}
void fft(int limit, vector<complex>&a, int type){if (limit == 1) return;vector<complex>a1, a2;a1.clear(); a2.clear();for (int i = 0; i <= limit; i += 2)a1.push_back(a[i]), a2.push_back(a[i + 1]);fft(limit >> 1, a1, type);fft(limit >> 1, a2, type);complex Wn = complex(cos(2.0 * Pi / limit), type * sin(2.0 * Pi / limit)), w = complex(1, 0);for (int i = 0; i < (limit >> 1); ++i, w = w * Wn) {a[i] = a1[i] + w * a2[i];a[i + (limit >> 1)] = a1[i] - w * a2[i];}a1.clear(); a2.clear();
}
void get_work(){int limit = 1;while (limit <= n + m) limit <<= 1;for (int i = n + 1; i <= limit; ++i) a.push_back(complex(0, 0));fft(limit, a, 1);for (int i = m + 1; i <= limit; ++i) b.push_back(complex(0, 0));fft(limit, b, 1);for (int i = 0; i <= limit; ++i) a[i] = a[i] * b[i];fft(limit, a, -1);for (int i = 0; i <= n + m; ++i) printf("%d ", (int)(a[i].x / limit + 0.5));
}
int main(){//freopen("/home/wxy/Desktop/testdata-1.in", "r", stdin);get_read();get_work();return 0;
}
//NNT
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#define ll long long
const int maxm=3e6+100,mod=998244353,g=3,gi=332748118;
inline ll fastpow(ll x,int y){ll ans=1;for(;y;y>>=1,x=(x*x)%mod)if(y&1) ans=(ans*x)%mod;return ans%mod;
}
int n,m,len;
ll inv,A[maxm],B[maxm],rev[maxm];
inline void NTT(ll *a,int f){for(int i=0;i<n;i++) if(i<rev[i]) std::swap(a[i],a[rev[i]]);for(int i=1;i<n;i<<=1){ll wn=fastpow((f==1)?g:gi,(mod-1)/(i<<1));for(int j=0;j<n;j+=(i<<1)){ll w=1;for(int k=0;k<i;k++,w=(w*wn)%mod){ll x=a[j+k],y=(w*a[i+j+k])%mod;a[j+k]=(x+y)%mod;a[i+j+k]=(x-y+mod)%mod;}}}if(f==-1)for(int i=0;i<n;i++) a[i]=(a[i]*inv)%mod;
}
int main(){scanf("%d%d",&n,&m);for(int i=0;i<=n;i++) scanf("%lld",&A[i]),A[i]=(A[i]+mod)%mod;for(int i=0;i<=m;i++) scanf("%lld",&B[i]),B[i]=(B[i]+mod)%mod;m+=n;for(n=1;n<=m;n<<=1) len++;inv=fastpow(n,mod-2);for(int i=0;i<n;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(len-1));NTT(A,1),NTT(B,1);for(int i=0;i<n;i++) A[i]=(A[i]*B[i]+mod)%mod;NTT(A,-1);for(int i=0;i<=m;i++) printf("%lld ",A[i]);return 0;
}

洛谷-3803 【模板】多项式乘法(FFT,NNT)相关推荐

  1. 多项式乘法 FFT模板

    题目传送门 在下只是来存个板子,,(板子还是洛谷找的2333) 证明的话,太(wo)难(bu)写(hui),就先留个坑吧,,, NOIP后,如果没退役,我会回来填坑的,, #include<bi ...

  2. 专题·树链剖分【including 洛谷·【模板】树链剖分

    初见安~~~终于学会了树剖~~~ [兴奋]当初机房的大佬在学树剖的时候我反复强调过:"学树剖没有前途的!!!" 恩.真香. 一.重链与重儿子 所谓树剖--树链剖分,就是赋予一个链的 ...

  3. 洛谷·【模板】点分树 | 震波【including 点分树

    初见安-这里是传送门:洛谷P6329 [模板]点分树 | 震波 一.点分树 其实你会点分治的话,点分树就是把点分治时的重心提出来重新连城一棵树. 比如当前点是u,求出子树v的重心root后将root与 ...

  4. 洛谷 P1919 模板】A*B Problem升级版(FFT快速傅里叶)

    https://www.luogu.com.cn/problem/P1919 题目背景 本题数据已加强,请使用 FFT/NTT,不要再交 Python 代码浪费评测资源. 题目描述 给你两个正整数 a ...

  5. 洛谷P4199 万径人踪灭(manacher+FFT)

    传送门 题目所求为所有的不连续回文子序列个数,可以转化为回文子序列数-回文子串数 回文子串manacher跑一跑就行了,考虑怎么求回文子序列数 我们考虑,如果$S_i$是回文子序列的对称中心,那么只要 ...

  6. 洛谷P3338:力(FFT)

    传送门 解析 算是比较适合的FFT入门题了吧 一个重要的trick: 当函数无法表示成卷积时,可以把函数翻转过来 然后调一调就又是卷积了 一个重要的注意事项是FFT的lim一定是两多项式相乘结果多项式 ...

  7. 洛谷.4245.[模板]任意模数NTT(MTT/三模数NTT)

    题目链接 三模数\(NTT\): 就是多模数\(NTT\)最后\(CRT\)一下...下面两篇讲的都挺明白的. https://blog.csdn.net/kscla/article/details/ ...

  8. 洛谷.4897.[模板]最小割树(Dinic)

    题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...

  9. 强连通分量:洛谷P3387 模板:缩点

    传送门 顾名思义,模板awa #include <cstdio> #include <cstring> #include <cmath> #include < ...

  10. 【后缀数组】洛谷P3809模板题

    题目背景 这是一道模板题. 题目描述 读入一个长度为 n n n 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置. ...

最新文章

  1. Linux学习之CentOS(三十四)--配置域主DNS服务器
  2. 以下可以采用python语言保留字的是-以下选项中不是 Python 语言的保留字的是
  3. java spring 集成定时器
  4. 如何使用LaTeX让自己不乱?
  5. expect to check grammarly intime
  6. 人脸测温门禁 传感器_湖南人脸测温门禁如何选择
  7. 计算机仿真随机数生成,伪随机数生成器研究
  8. 使用Flash Pro CC 输出动画--html5-canvas
  9. 纯CSS导航栏下划线跟随效果
  10. Android之四大组件、六大布局、五大存储
  11. 2021年小目标检测最新研究综述
  12. 如何换ip ,最简单有效的换ip方法在这里
  13. 驾培行业现状改革创新探索互联网+品牌服务模式
  14. python的PIL库
  15. macOS Monterey 12.2 (21D49) 正式版 ISO、IPSW、PKG 下载
  16. Python 输出对齐
  17. CMMI 认证为什么要提前准备?评估方式是怎样的?
  18. python入门知识点学习笔记(二)
  19. iOS视频 ZFPlayer使用
  20. 用墨刀设计原型,易被忽略的8种玩法。

热门文章

  1. 紧急通知!限招100人:免费培训海外抖音TikTok视频搬运赚钱技能,0基础轻松月入2万+!...
  2. 金融量化分析【day112】:量化平台的使用-第一个策略
  3. 迪赛智慧数——柱状图(多色柱状图):母亲节大家都怎么挑选礼物
  4. 网盘变成本地硬盘教程
  5. python做正态分布的例子_python实现正态分布
  6. 免费试用微软云服务Azure(无需信用卡版)
  7. 稻盛和夫《干法》读后感
  8. 马云:眼光有多远 未来就有多远【2014世界互联网大会】
  9. 如何政治正确地黑中国玄幻小说?!
  10. Springboot 邮件发送(html内嵌图片、附件)