P4245 【模板】任意模数NTT
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define Debug(x) cout<<#x<<"="<<x<<endl
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){
register LL x=0,f=1;register char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
return f*x;
}
namespace Math{
inline int qpow(LL a,int b,int mod){
LL res=1;
while(b){
if(b&1) (res*=a)%=mod;
(a*=a)%=mod;
b>>=1;
}
return (int)res;
}
inline int inv(int x,int mod){return qpow(x,mod-2,mod);}
}using namespace Math;
const int mod1=998244353,mod2=1004535809,mod3=469762049,G=3;
const LL mod_1_2=(LL)mod1*mod2;
const int inv_1=inv(mod1,mod2),inv_1_2=inv(mod_1_2%mod3,mod3);
const int MAXN=3e5+5;
int mod;
struct Int{
int A,B,C;
inline Int(){}
inline Int(int _num):A(_num),B(_num),C(_num){}
inline Int(int _A,int _B,int _C):A(_A),B(_B),C(_C){}
static inline Int add(Int x){///static不可省
return Int(x.A+(x.A>>31&mod1),x.B+(x.B>>31&mod2),x.C+(x.C>>31&mod3));
}
inline friend Int operator + (Int x,Int y){
return add(Int(x.A+y.A-mod1,x.B+y.B-mod2,x.C+y.C-mod3));
}
inline friend Int operator - (Int x,Int y){
return add(Int(x.A-y.A,x.B-y.B,x.C-y.C));
}
inline friend Int operator * (Int x,Int y){
return Int((LL)x.A*y.A%mod1,(LL)x.B*y.B%mod2,(LL)x.C*y.C%mod3);
}
inline int get(){
LL x=(B-A+mod2)%mod2*inv_1%mod2*mod1+A;
return ((C-x%mod3+mod3)%mod3*inv_1_2%mod3*(mod_1_2%mod)%mod+x)%mod;
}
}A[MAXN],B[MAXN];
namespace N_T_T{
Int Wn[MAXN],ilim;
int rev[MAXN],limit=1,l;
inline void init(int n){
limit=1,l=0;
while(limit<=n) limit<<=1,l++;
for(int i=0;i<limit;i++)
rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1));
Int w=(Int){qpow(G,(mod1-1)/limit,mod1),qpow(G,(mod2-1)/limit,mod2),qpow(G,(mod3-1)/limit,mod3)};
Wn[0]=Int(1);
for(int i=1;i<=limit;i++) Wn[i]=Wn[i-1]*w;//只有这里一个地方取=
ilim=(Int){inv(limit,mod1),inv(limit,mod2),inv(limit,mod3)};
}
inline void NTT(Int *A,int type){
for(int i=0;i<limit;i++)
if(i<rev[i]) swap(A[i],A[rev[i]]);
for(int len=1;len<limit;len<<=1){
int t=(limit/len)>>1;
for(int i=0;i<limit;i+=(len<<1))
for(int j=0;j<len;j++){
Int w=(type==1)?Wn[t*j]:Wn[limit-t*j];
Int x=A[i+j],y=w*A[i+len+j];
A[i+j]=x+y,A[i+len+j]=x-y;
}
}
if(type==-1){
for(int i=0;i<limit;i++) A[i]=A[i]*ilim;
}
}
}using namespace N_T_T;
int n,m;
int main(){
n=read(),m=read(),mod=read();
for(int i=0;i<=n;i++) A[i]=Int(read()%mod);
for(int i=0;i<=m;i++) B[i]=Int(read()%mod);
init(n+m+2);
NTT(A,1);NTT(B,1);
for(int i=0;i<limit;i++) A[i]=A[i]*B[i];
NTT(A,-1);//只要做三次
for(int i=0;i<=n+m;i++)
printf("%d ",A[i].get());
}
P4245 【模板】任意模数NTT的更多相关文章
- 洛谷 P4245 [模板]任意模数NTT —— 三模数NTT / 拆系数FFT(MTT)
题目:https://www.luogu.org/problemnew/show/P4245 用三模数NTT做,需要注意时间和细节: 注意各种地方要取模!传入 upt() 里面的数一定要不超过2倍 m ...
- [题解] Luogu P4245 [模板]任意模数NTT
三模NTT 不会... 都0202年了,还有人写三模NTT啊... 讲一个好写点的做法吧: 首先取一个阀值\(w\),然后把多项式的每个系数写成\(aw + c(c < w)\)的形式,换句话说 ...
- 洛谷.4245.[模板]任意模数NTT(MTT/三模数NTT)
题目链接 三模数\(NTT\): 就是多模数\(NTT\)最后\(CRT\)一下...下面两篇讲的都挺明白的. https://blog.csdn.net/kscla/article/details/ ...
- [洛谷P4245]【模板】任意模数NTT
题目大意:给你两个多项式$f(x)$和$g(x)$以及一个模数$p(p\leqslant10^9)$,求$f*g\pmod p$ 题解:任意模数$NTT$,最大的数为$p^2\times\max\{n ...
- 【模板】任意模数NTT
题目描述: luogu 题解: 用$fft$水过(什么$ntt$我不知道). 众所周知,$fft$精度低,$ntt$处理范围小. 所以就有了任意模数ntt神奇$fft$! 意思是这样的.比如我要算$F ...
- MTT:任意模数NTT
MTT:任意模数NTT 概述 有时我们用FFT处理的数据很大,而模数可以分解为\(a\cdot 2^k+1\)的形式.次数用FFT精度不够,用NTT又找不到足够大的模数,于是MTT就应运而生了. MT ...
- 任意模数NTT
任意模数\(NTT\) 众所周知,为了满足单位根的性质,\(NTT\)需要质数模数,而且需要能写成\(a2^{k} + r\)且\(2^k \ge n\) 比较常用的有\(998244353,1004 ...
- 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)
再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...
- BZOJ1042 HAOI2008硬币购物(任意模数NTT+多项式求逆+生成函数/容斥原理+动态规划)
第一眼生成函数.四个等比数列形式的多项式相乘,可以化成四个分式.其中分母部分是固定的,可以多项式求逆预处理出来.而分子部分由于项数很少,询问时2^4算一下贡献就好了.这个思路比较直观.只是常数巨大,以 ...
- 【知识总结】多项式全家桶(三)(任意模数NTT)
经过两个月的咕咕,"多项式全家桶" 系列终于迎来了第三期--(雾) 上一篇:[知识总结]多项式全家桶(二)(ln和exp) 先膜拜(伏地膜)大恐龙的博客:任意模数 NTT (在页面 ...
随机推荐
- C语言学习笔记--指针阅读技巧
1. 指针阅读技巧:右左法则 (1)从最里层的圆括号中未定义的标示符看起 (2)首先往右看,再往左看 (3)遇到圆括号或方括号时可以确定部分类型,并调转方向 (4)重复 2.3 步骤,直到阅读结束 注 ...
- 使用LaTeX按IEEE模板写论文时的参考文献管理方法(BibTeX使用小结)
之前用LaTeX写论文时,参考文献都是手动添加管理的,真是让人很抓狂.所以这次趁着假期,简单看了一下怎么使用BibTeX对参考文献进行管理,这里以IEEE的最新模板为例. 首先说明,我之前用的是MiK ...
- 第一天:tomcat相关知识和浏览器的访问机制
1.tomcat的目录结构 1)bin目录:启动和关闭tomcat以及其他的脚本命令 2)conf目录:存放各种配置文件 a.server.xml配置文件的配置: *<host/>标签: ...
- PTA 估值一亿的AI核心代码
题面 比赛时被模拟题打自闭了,本来以为是个比较麻烦的模拟,实际上只要会C++的regex不到40行就能把这个题过掉了(orz smz) regex是用来处理正则表达式,里面有个函数regex_repl ...
- wenfrom的简单控件和repeater控件
简单控件 lable 转换成<span>标记 literal 空的 什么也没转换 Literal.Text=<script>alter('你好');</scrip ...
- 25-Fibonacci(矩阵快速幂)
http://poj.org/problem?id=3070 Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- 算法Sedgewick第四版-第1章基础-025-用队列实现unix下的Directory命令
package algorithms.util; /************************************************************************** ...
- java开发中用到的技术(持续更新.....)
一.数据库 1.数据库连接池:当jdbc连接数据库使用DriverManager 获取时,每次向数据库建立连接的时候都要讲connection加载到内存中,当同时使用的用户数量较大时,会造成服务器不堪 ...
- 前端基础 之 BOM和DOM
浏览目录 背景 BOM window对象 window的子对象 DOM HTML DOM树 查找标签 节点操作 事件 一.背景 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些 ...
- 层次分析法(Analytic Hierarchy Process,AHP)
昨天晚上室友问我什么是层次分析法?我当时就大概给他介绍了一下,没有细讲. 今天我仔细讲讲这个. 层次分析法是运筹学里面的一种方法,是讲与决策总是有关的元素分解成目标.准则.方案等层次,在此基础上进行定 ...