三模数 NTT,感觉不是很难写 $?$

代码借鉴的 https://www.cnblogs.com/Mychael/p/9297652.html

code:

#include <bits/stdc++.h>
#define SIZE 400005
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
inline ll qpow(ll x,ll y,ll Mod)
{
ll re=1ll;
for(x%=Mod;y;y>>=1,x=x*x%Mod) if(y&1) re=re*x%Mod;
return re;
}
int pr[3]={469762049,998244353,1004535809};
struct poly
{
int G,Mod,A[SIZE];
void NTT(int *a,int len,int flag)
{
int i,j,k,mid;
for(i=k=0;i<len;++i)
{
if(i>k) swap(a[i],a[k]);
for(j=len>>1;(k^=j)<j;j>>=1);
}
for(mid=1;mid<len;mid<<=1)
{
int wn=qpow(G,(Mod-1)/(mid<<1),Mod);
if(flag==-1) wn=qpow(wn,Mod-2,Mod);
for(i=0;i<len;i+=mid<<1)
{
int w=1;
for(j=0;j<mid;++j)
{
int x=a[i+j], y=1ll*w*a[i+j+mid]%Mod;
a[i+j]=1ll*(x+y)%Mod, a[i+j+mid]=(x-y+Mod)%Mod;
w=1ll*w*wn%Mod;
}
}
}
if(flag==-1)
{
int rev=qpow(len,Mod-2,Mod);
for(i=0;i<len;++i) a[i]=1ll*a[i]*rev%Mod;
}
}
}ntt[3];
ll ans[SIZE];
int F[SIZE],G[SIZE],B[SIZE],deg1,deg2,deg,md;
ll INV(ll n,ll p) { return qpow(n%p, p-2,p); }
ll mul(ll a,ll b,ll p)
{
ll re=0;
for(;b;b>>=1,a=(a+a)%p) if(b&1) re=(re+a)%p;
return re;
}
void CRT()
{
deg=deg1+deg2;
ll a,b,c,t,k,M=1ll*pr[0]*pr[1];
ll inv1=INV(pr[1],pr[0]), inv0=INV(pr[0],pr[1]),inv3=INV(M%pr[2],pr[2]);
for(int i=0;i<=deg;++i)
{
a=ntt[0].A[i];
b=ntt[1].A[i];
c=ntt[2].A[i];
t=(mul(a*pr[1]%M,inv1,M)+mul(b*pr[0]%M,inv0,M))%M;
k=((c-t%pr[2])%pr[2]+pr[2])%pr[2]*inv3%pr[2];
ans[i]=((k%md)*(M%md)%md+t%md)%md;
}
}
void conv()
{
int n=1;
while(n<=(deg1+deg2)) n<<=1;
for(int u=0;u<=2;++u)
{
ntt[u].G=3;
ntt[u].Mod=pr[u];
for(int i=0;i<=deg1;++i) ntt[u].A[i]=F[i];
for(int i=0;i<=deg2;++i) B[i]=G[i];
for(int i=deg2+1;i<n;++i) B[i]=0;
ntt[u].NTT(ntt[u].A,n,1);
ntt[u].NTT(B,n,1);
for(int i=0;i<n;++i) ntt[u].A[i]=1ll*ntt[u].A[i]*B[i]%pr[u];
ntt[u].NTT(ntt[u].A,n,-1);
}
}
int main()
{
// setIO("input");
scanf("%d%d%d",&deg1,&deg2,&md);
for(int i=0;i<=deg1;++i) scanf("%d",&F[i]);
for(int i=0;i<=deg2;++i) scanf("%d",&G[i]);
conv();
CRT();
for(int i=0;i<=deg;++i) printf("%lld ",ans[i]);
return 0;
}

  

【洛谷P4245】 【模板】任意模数NTT的更多相关文章

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

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

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

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

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

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

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

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

  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 (在页面 ...

  10. MTT:任意模数NTT

    MTT:任意模数NTT 概述 有时我们用FFT处理的数据很大,而模数可以分解为\(a\cdot 2^k+1\)的形式.次数用FFT精度不够,用NTT又找不到足够大的模数,于是MTT就应运而生了. MT ...

随机推荐

  1. [SOJ #537]不包含 [CF102129I]Incomparable Pairs(2019-8-6考试)

    题目大意:给定一个长度为$n$的字符串$s$,求有多少个无序字符串二元组$(x,y)$满足:$x,y$是$s$的字串,且$x$不是$y$的字串,$y$不是$x$的字串 题解:发现满足$x,y$是$s$ ...

  2. Gym 102055B Balance of the Force

    大意: $n$个骑士, 第$i$个骑士若加入光明阵营, 那么能力值$L_i$, 加入黑暗阵营, 能力值$D_i$. 给定$m$个限制$(u_i,v_i)$, 表示$u_i,v_i$不能在同一阵营. 求 ...

  3. android使用http3

    http3的github地址: https://github.com/cloudflare/quiche

  4. C# vb .net实现灰度化特效滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的灰度化呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步: ...

  5. ios手机app消息推送

    h5+app项目,推送平台 " 个推 " 首先在manifest.json配置文件中点击模块权限配置,勾选push消息推送配置如图1-1 第二部在manifest.json配置文件 ...

  6. vue 解决ios编辑器输入框不能拉起

    一.问题描述:Android .pc.下可以正常使用,在ios下可以拉起输入框但是无法输入 <div contenteditable="true" ></div& ...

  7. Oracle 操作数据库(增删改语句)

    对数据库的操作除了查询,还包括插入.更新和删除等数据操作.后3种数据操作使用的 SQL 语言也称为数据操纵语言(DML). 一.插入数据(insert 语句) 插入数据就是将数据记录添加到已经存在的数 ...

  8. Sbase数据库自动截断日志

    http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc36273.1550/html/sprocs/X3 ...

  9. python 提取目录中特定类型的文件

    python使用‘os’和‘re’模块提取目录中特定类型的文件,这两个模都是安装python自带的,所以不需要安装. 思路: 使用os库lilstdir获取文件夹中的所有文件名,然后带上文件夹路径组合 ...

  10. Python线性回归算法【解析解,sklearn机器学习库】

    一.概述 参考博客:https://www.cnblogs.com/yszd/p/8529704.html 二.代码实现[解析解] import numpy as np import matplotl ...