https://www.luogu.org/problemnew/show/P4245

给两个多项式,求其乘积,每个系数对p取模。

参考:

代码与部分理解参考https://www.luogu.org/blog/yhzq/solution-p4245

NTT常用模数https://blog.csdn.net/hnust_xx/article/details/76572828

一些有关NTT讲解的东西。

————————————

NTT作用和DFT相同,只是NTT可以取模,且精度误差小。

我们的唯一限制就是取模的质数p=k*2^n+1,因此998244353应运而生。

对于如何构造使得每次变换都会减少一半的长度这个问题和p的原根有关,在这里就不讲了。

然而对于p不确定的时候,我们也可以使用中国剩余定理。

具体来说,找到一些p1,p2……pk满足NTT条件,然后计算结果,最后用中国剩余定理依次消即可。

然而这题很恶心的是很有可能爆longlong,且在模数大于int的情况下也没法快速乘,这时候就要使用骆克强提出的快速乘了(具体可以前往参考处第一篇博客。)

#include<cstdio>
#include<cctype>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
typedef long double dl;
const int N=5e5+;
const ll p1=,p2=,p3=,g=;
const ll M=p1*p2;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
ll qpow(ll a,ll n,ll p){
ll res=;
while(n){
if(n&)res=res*a%p;
a=a*a%p;n>>=;
}
return res;
}
ll qmulti(ll a,ll b,ll p){
a%=p,b%=p;
return ((a*b-(ll)((ll)((dl)a/p*b+0.5)*p))%p+p)%p;
}
void FNT(ll a[],int n,int on,ll p){
for(int i=,j=n>>;i<n-;i++){
if(i<j)swap(a[i],a[j]);
int k=n>>;
while(j>=k){j-=k;k>>=;}
if(j<k)j+=k;
}
for(int i=;i<=n;i<<=){
ll res=qpow(g,(p-)/i,p);
for(int j=;j<n;j+=i){
ll w=;
for(int k=j;k<j+i/;k++){
ll u=a[k],t=w*a[k+i/]%p;
a[k]=(u+t)%p;
a[k+i/]=(u-t+p)%p;
w=w*res%p;
}
}
}
if(on==-){
ll inv=qpow(n,p-,p);
a[]=a[]*inv%p;
for(int i=;i<=n/;i++){
a[i]=a[i]*inv%p;
if(i!=n-i)a[n-i]=a[n-i]*inv%p;
swap(a[i],a[n-i]);
}
}
}
int n,m,p;
ll a[N],b[N],c[N],d[N],ans[][N];
int main(){
n=read(),m=read(),p=read();
for(int i=;i<=n;i++)a[i]=read();
for(int i=;i<=m;i++)b[i]=read();
int nn=;
while(nn<=n+m)nn<<=; memcpy(c,a,sizeof(a));memcpy(d,b,sizeof(b));
FNT(c,nn,,p1);FNT(d,nn,,p1);
for(int i=;i<nn;i++)ans[][i]=c[i]*d[i]%p1;
memset(c,,sizeof(c));memset(d,,sizeof(d)); memcpy(c,a,sizeof(a));memcpy(d,b,sizeof(b));
FNT(c,nn,,p2);FNT(d,nn,,p2);
for(int i=;i<nn;i++)ans[][i]=c[i]*d[i]%p2;
memset(c,,sizeof(c));memset(d,,sizeof(d)); memcpy(c,a,sizeof(a));memcpy(d,b,sizeof(b));
FNT(c,nn,,p3);FNT(d,nn,,p3);
for(int i=;i<nn;i++)ans[][i]=c[i]*d[i]%p3;
memset(c,,sizeof(c));memset(d,,sizeof(d)); FNT(ans[],nn,-,p1);
FNT(ans[],nn,-,p2);
FNT(ans[],nn,-,p3); for(int i=;i<=n+m;i++){
ll A=(qmulti(ans[][i]*p2%M,qpow(p2%p1,p1-,p1),M)+
qmulti(ans[][i]*p1%M,qpow(p1%p2,p2-,p2),M))%M;
ll k=((ans[][i]-A)%p3+p3)%p3*qpow(M%p3,p3-,p3)%p3;
printf("%lld ",((k%p)*(M%p)%p+A%p)%p);
}
puts("");
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

洛谷4245:【模板】任意模数NTT——题解的更多相关文章

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

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

  2. 洛谷 P4245 [模板]任意模数NTT —— 三模数NTT / 拆系数FFT(MTT)

    题目:https://www.luogu.org/problemnew/show/P4245 用三模数NTT做,需要注意时间和细节: 注意各种地方要取模!传入 upt() 里面的数一定要不超过2倍 m ...

  3. 洛谷.3803.[模板]多项式乘法(NTT)

    题目链接:洛谷.LOJ. 为什么和那些差那么多啊.. 在这里记一下原根 Definition 阶 若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\ ...

  4. [题解] Luogu P4245 [模板]任意模数NTT

    三模NTT 不会... 都0202年了,还有人写三模NTT啊... 讲一个好写点的做法吧: 首先取一个阀值\(w\),然后把多项式的每个系数写成\(aw + c(c < w)\)的形式,换句话说 ...

  5. 洛谷.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 ...

  6. 洛谷.4512.[模板]多项式除法(NTT)

    题目链接 多项式除法 & 取模 很神奇,记录一下. 只是主要部分,更详细的和其它内容看这吧. 给定一个\(n\)次多项式\(A(x)\)和\(m\)次多项式\(D(x)\),求\(deg(Q) ...

  7. [洛谷P4245]【模板】任意模数NTT

    题目大意:给你两个多项式$f(x)$和$g(x)$以及一个模数$p(p\leqslant10^9)$,求$f*g\pmod p$ 题解:任意模数$NTT$,最大的数为$p^2\times\max\{n ...

  8. 【模板】任意模数NTT

    题目描述: luogu 题解: 用$fft$水过(什么$ntt$我不知道). 众所周知,$fft$精度低,$ntt$处理范围小. 所以就有了任意模数ntt神奇$fft$! 意思是这样的.比如我要算$F ...

  9. 【知识总结】多项式全家桶(三)(任意模数NTT)

    经过两个月的咕咕,"多项式全家桶" 系列终于迎来了第三期--(雾) 上一篇:[知识总结]多项式全家桶(二)(ln和exp) 先膜拜(伏地膜)大恐龙的博客:任意模数 NTT (在页面 ...

随机推荐

  1. 写了个汉字转G代码工具,无描边的那种,市面上没有类似的小软件

    学了不少G代码知识, 将公司废旧的三轴非标设备改造成了一个雕刻机,市面上的小软件不好用 网上下的软件有描边的,字体刻起来太粗,这个比较好用,看图应该都能明白吧, 就自己写了个,“少于150字的随笔不允 ...

  2. Python类对象

    python类对象 python类对象支持两种操作:属性引用和实例化. 属性引用 使用 Python 中所有属性引用所使用的标准语法: obj.name. 有效的属性名称是类对象被创建时存在于类命名空 ...

  3. 【springmvc+mybatis项目实战】杰信商贸-2.数据库配置

    首先我们来了解项目的架构 我们分别使用了MySql和Oracle数据库,即是异构数据库.我们做到一个平台支持多个数据库.数据库建模我们使用Sybase公司的PowerDesigner(以后简称PD), ...

  4. CSP201609-1:最大波动

    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...

  5. markdown语法介绍

    1. 标题类 每级标题用"# title"表示,共支持6级标题: 2. 段落类 1.建议用换行符控制: 2.用"<p></p>"控制: ...

  6. ThreadLocal 线程的私有内存

    话说在<操作系统原理>这门课里面,我们学到了很多概念:进程.线程.锁.PV操作.读写者问题等等,大家还记得么?(估计有些概念早已忘记了吧,哈哈哈~) 其中关于进程.线程和锁的东西是我们平时 ...

  7. 饥饿的小易(枚举+广度优先遍历(BFS))

    题目描述 小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃.最开始小易在一个初始位置x_0.对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x + 3或者8 * x + 7.因为使 ...

  8. 贵州省未来二十年的投资机会的探讨1>

    贵州的股市 1.000540.SZ 中天金融 2.000589.SZ 黔轮胎A 3.000733.SZ 振华科技 4.000851.SZ 高鸿股份 5.000920.SZ 南方汇通 6.002025. ...

  9. 2.hadoop基本配置,本地模式,伪分布式搭建

    2. Hadoop三种集群方式 1. 三种集群方式 本地模式 hdfs dfs -ls / 不需要启动任何进程 伪分布式 所有进程跑在一个机器上 完全分布式 每个机器运行不同的进程 2. 服务器基本配 ...

  10. 2.hbase原理(未完待续)

    hbase简介相关概念hmsterhregionserver表regionhstorememstorestorefilehfileblockcacheWALminorcompactmajorcompa ...