洛谷P3803 【模板】多项式乘法 [NTT]
多项式乘法
题目描述
给定一个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 2
1 2
1 2 1
1 4 5 2
说明
保证输入中的系数大于等于 0 且小于等于9。
对于100%的数据: $n, m \leq {10}^6$ , 共计20个数据点,2s。
数据有一定梯度。
空间限制:256MB
分析:
没错,这是一道FFT模板,于是我们愉快地用NTT把它A了。
平常用的较多的都是FFT,但是FFT使用的是复数,需要开double类型,常数会比较大。但有时候我们需要求的都是整型,那么用NTT(快速数论变换)就可以把常数降低很多。具体实现理论和FFT基本无异,不过我们要把单位根换成原根,因为原根也满足单位根的性质,最后就可得到一个结论:$w_n \equiv g^{\frac {p-1} {n}} \pmod p$。具体的理论推荐这位大佬的博客。(吐槽一句,为什么开了O2之后不管是FFT还是NTT都反而更慢了???难道是我的代码写得太优秀???)
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e6+;
const int mod=;
int n,m,lim,r[N];
int G=,Gi=;
ll a[N],b[N];
inline ll read()
{
char ch=getchar();ll num=;bool flag=false;
while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
return flag?-num:num;
}
inline void Swap(ll &x,ll &y)
{
x^=y,y^=x,x^=y;
}
inline ll power(ll x,ll y)
{
ll ret=;
while(y){
if(y&)ret=(ret*x)%mod;
y>>=;x=(x*x)%mod;}
return ret;
}
inline void ntt(ll *A,int type)
{
for(int i=;i<lim;i++)
if(i<r[i])Swap(A[i],A[r[i]]);
for(int mid=;mid<lim;mid<<=){
ll wn=power((type==)?G:Gi,(mod-)/(mid<<));
for(int j=;j<lim;j+=(mid<<)){
ll w=;
for(int k=;k<mid;w=(w*wn)%mod,k++){
ll x=A[j+k],y=A[mid+j+k]*w%mod;
A[j+k]=(x+y)%mod;
A[mid+j+k]=(x-y+mod)%mod;
}
}
}
}
int main()
{
n=read();m=read();
for(int i=;i<=n;i++)a[i]=(read()+mod)%mod;
for(int i=;i<=m;i++)b[i]=(read()+mod)%mod;
m+=n;n=;
for(lim=;lim<=m;lim<<=)n++;
for(int i=;i<lim;i++)
r[i]=(r[i>>]>>)|((i&)<<(n-));
ntt(a,);ntt(b,);
for(int i=;i<lim;i++)a[i]=(a[i]*b[i])%mod;
ntt(a,-);ll inv=power(lim,mod-);
for(int i=;i<=m;i++)
printf("%lld ",(a[i]*inv)%mod);
return ;
}
洛谷P3803 【模板】多项式乘法 [NTT]的更多相关文章
- 洛谷.3803.[模板]多项式乘法(NTT)
题目链接:洛谷.LOJ. 为什么和那些差那么多啊.. 在这里记一下原根 Definition 阶 若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\ ...
- 洛谷.3803.[模板]多项式乘法(FFT)
题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...
- 洛谷.4512.[模板]多项式除法(NTT)
题目链接 多项式除法 & 取模 很神奇,记录一下. 只是主要部分,更详细的和其它内容看这吧. 给定一个\(n\)次多项式\(A(x)\)和\(m\)次多项式\(D(x)\),求\(deg(Q) ...
- 洛谷.4238.[模板]多项式求逆(NTT)
题目链接 设多项式\(f(x)\)在模\(x^n\)下的逆元为\(g(x)\) \[f(x)g(x)\equiv 1\ (mod\ x^n)\] \[f(x)g(x)-1\equiv 0\ (mod\ ...
- 洛谷.4721.[模板]分治FFT(NTT)
题目链接 换一下形式:\[f_i=\sum_{j=0}^{i-1}f_jg_{i-j}\] 然后就是分治FFT模板了\[f_{i,i\in[mid+1,r]}=\sum_{j=l}^{mid}f_jg ...
- 洛谷 P4245 [模板]任意模数NTT —— 三模数NTT / 拆系数FFT(MTT)
题目:https://www.luogu.org/problemnew/show/P4245 用三模数NTT做,需要注意时间和细节: 注意各种地方要取模!传入 upt() 里面的数一定要不超过2倍 m ...
- 洛谷.4245.[模板]任意模数NTT(MTT/三模数NTT)
题目链接 三模数\(NTT\): 就是多模数\(NTT\)最后\(CRT\)一下...下面两篇讲的都挺明白的. https://blog.csdn.net/kscla/article/details/ ...
- 洛谷 P4512 [模板] 多项式除法
题目:https://www.luogu.org/problemnew/show/P4512 看博客:https://www.cnblogs.com/owenyu/p/6724611.html htt ...
- 洛谷 P4238 [模板] 多项式求逆
题目:https://www.luogu.org/problemnew/show/P4238 看博客:https://www.cnblogs.com/xiefengze1/p/9107752.html ...
- P3803 [模板] 多项式乘法 (FFT)
Rt 注意len要为2的幂 #include <bits/stdc++.h> using namespace std; const double PI = acos(-1.0); inli ...
随机推荐
- 前端PHP入门-032-异常处理-应用级别
禁止显示错误 在php.ini配置文件中.我们可以控制php的错误显示状态. php.ini中有一个专门的配置项: display_errors 这个选项设置是否将错误信息输出到网页,或者对用户隐藏而 ...
- Android Studio获取调试版SHA1和发布版SHA1的方法
前言: 当我们在集成高德地图定位功能到项目中的时候,需要用到发布版和调试版的安全码SHA1,所以今天我就来总结一下分别在Windows和Mac下是怎么来获取SHA1的,希望对大家有所帮助. 首先,统一 ...
- == 和 equals,equals 与 hashcode,HashSet 和 HashMap,HashMap 和 Hashtable
一:== 和 equals == 比较引用的地址equals 比较引用的内容 (Object 类本身除外) String obj1 = new String("xyz"); Str ...
- ZOJ 3777 B - Problem Arrangement 状压DP
LINK:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3777 题意:有N(\( N <= 12 \))道题,排顺序 ...
- Flask---使用Bootstrap新建第一个demo
Flask---使用Bootstrap新建第一个demo 参考自http://www.jianshu.com/p/417bcbad82fb 还有<Flask web开发> 前端用到Boot ...
- 分享一个彻底冻结对象的函数——来自阮一峰老师的《ECMAScript 6 入门》
var constantize = (obj) => { Object.freeze(obj); Object.keys(obj).forEach( (key, i) => { if ( ...
- 【洛谷P1104】生日
题目描述 cjf君想调查学校OI组每个同学的生日,并按照从大到小的顺序排序.但cjf君最近作业很多,没有时间,所以请你帮她排序. 输入输出格式 输入格式: 有2行,第1行为OI组总人数n:第2行至第n ...
- lintcode 66.67.68 二叉树遍历(前序、中序、后序)
AC代码: /** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode le ...
- 如何关闭sublime更新提示
前提:sublime已激活
- php常用函数——数学函数
php常用函数——数学函数