三模数NTT模板

求两个多项式的卷积对任意数p取模

两个好记的FNT模数:

5*2^25+1

7*2^26+1

原根都为3

 1 //Achen
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include<vector>
 7 #include<cstdio>
 8 #include<queue>
 9 #include<cmath>
10 #include<set>
11 #include<map>
12 #define Formylove return 0
13 #define For(i,a,b) for(int i=(a);i<=(b);i++)
14 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
15 const int N=524299,g=3;
16 typedef long long LL;
17 typedef double db;
18 typedef long double LD;
19 using namespace std;
20 int n,m,mod;
21 LL a[3][N],b[3][N],p[4]={998244353,167772161,469762049},gi[4]={332748118,55924054,156587350};
22 LL ans[N];
23
24 template<typename T>void read(T &x)  {
25     char ch=getchar(); x=0; T f=1;
26     while(ch!=‘-‘&&(ch<‘0‘||ch>‘9‘)) ch=getchar();
27     if(ch==‘-‘) f=-1,ch=getchar();
28     for(;ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=x*10+ch-‘0‘; x*=f;
29 }
30
31 LL ksc(LL a,LL b,LL p) {
32     LL tp=a*b-(LL)((LD)a/p*b+1.0e-8)*p;
33     return tp<0?tp+p:tp%p;
34 }
35
36 LL ksm(LL a,LL b,LL p) {
37     LL rs=1,bs=a%p;
38     while(b) {
39         if(b&1) rs=ksc(rs,bs,p);
40         bs=ksc(bs,bs,p);
41         b>>=1;
42     }
43     return rs;
44 }
45
46 int l,rev[N];
47 void FFT(int n,LL a[],int f,int p,int gi) {
48     For(i,0,n-1) if(i<rev[i]) swap(a[i],a[rev[i]]);
49     for(int i=1;i<n;i<<=1) {
50         LL wi=ksm((f==1)?g:gi,(p-1)/(i<<1),p);
51         for(int j=0,pp=(i<<1);j<n;j+=pp) {
52             LL w=1;
53             for(int k=0;k<i;k++,w=w*wi%p) {
54                 LL x=a[j+k],y=w*a[j+k+i]%p;
55                 a[j+k]=(x+y)%p; a[j+k+i]=(x-y+p)%p;
56             }
57         }
58     }
59     if(f==-1) {
60         LL inv=ksm(n,p-2,p);
61         For(i,0,n) a[i]=a[i]*inv%p;
62     }
63 }
64
65 int main() {
66 #ifdef ANS
67     freopen(".in","r",stdin);
68     freopen(".out","w",stdout);
69 #endif
70     read(n); read(m); read(mod);
71     For(i,0,n) { read(a[0][i]); a[1][i]=a[2][i]=a[0][i]; }
72     For(i,0,m) { read(b[0][i]); b[1][i]=b[2][i]=b[0][i]; }
73     m+=n;
74     for(n=1;n<=m;n<<=1) l++;
75     For(i,1,n) rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1));
76     For(i,0,2) {
77         FFT(n,a[i],1,p[i],gi[i]);
78         FFT(n,b[i],1,p[i],gi[i]);
79         For(j,0,n) a[i][j]=a[i][j]*b[i][j]%p[i];
80         FFT(n,a[i],-1,p[i],gi[i]);
81     }
82     LL p1=p[0],p2=p[1],p3=p[2];
83     For(i,0,m) {
84         LL b1=a[0][i],b2=a[1][i],b3=a[2][i],b4;
85         b4=(ksc(ksc(b1,ksm(p2,p1-2,p1),p1*p2),p2,p1*p2)+ksc(ksc(b2,ksm(p1,p2-2,p2),p1*p2),p1,p1*p2))%(p1*p2);
86         LL k=((b3%p3-b4%p3+p3)%p3)*ksm(p1*p2,p3-2,p3)%p3;
87         ans[i]=(b4%mod+k*p1%mod*p2%mod)%mod;
88     }
89     For(i,0,m) printf("%lld ",ans[i]); puts("");
90     Formylove;
91 }

原文地址:https://www.cnblogs.com/Achenchen/p/9531952.html

时间: 2024-08-01 06:11:55

三模数NTT模板的相关文章

洛谷P4245 【模板】MTT(任意模数NTT)

题目背景 模板题,无背景 题目描述 给定 22 个多项式 F(x), G(x)F(x),G(x) ,请求出 F(x) * G(x)F(x)∗G(x) . 系数对 pp 取模,且不保证 pp 可以分解成 p = a \cdot 2^k + 1p=a⋅2k+1 之形式. 输入输出格式 输入格式: 输入共 33 行.第一行 33 个整数 n, m, pn,m,p ,分别表示 F(x), G(x)F(x),G(x) 的次数以及模数 pp .第二行为 n+1n+1 个整数, 第 ii 个整数 a_iai?

MTT:任意模数NTT

MTT:任意模数NTT 概述 有时我们用FFT处理的数据很大,而模数可以分解为\(a\cdot 2^k+1\)的形式.次数用FFT精度不够,用NTT又找不到足够大的模数,于是MTT就应运而生了. MTT没有模数的限制,比NTT更加自由,应用广泛,可以用于任意模数或很大的数. MTT MTT是基于NTT的,其思想很简单,就是做多次NTT,每次使用不同的素数,然后使用CRT合并解,在合并的过程中模最终模数,或是对于无模数的情况使用高精度. 做NTT的次数取决于最大可能答案的大小,所用的所有素数之积必

任意模数NTT(MTT)模板

记住代码里3个模数,它们的原根都是3.考虑通过3个模数下的答案用中国剩余定理乱搞,得出答案.常数较大.有个什么拆系数FFT不会. P4245 [模板]任意模数NTT #include<bits/stdc++.h> using namespace std; typedef long long LL; #define rint register int const int mod[3]={469762049,998244353,1004535809}; const int N=400010; in

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

三模NTT 不会... 都0202年了,还有人写三模NTT啊... 讲一个好写点的做法吧: 首先取一个阀值\(w\),然后把多项式的每个系数写成\(aw + c(c < w)\)的形式,换句话说把多项式\(f(x)\)写成两个多项式相加的形式: \[ f(x) = wf_0(x) + f_1(x) \] 这样在这道题中取\(W = 2^{15}\)就可以避免爆long long了. 乘起来的话就是 \[ f \cdot g = (w f_0 + f_1)(wg_0 + g_1) = (f_0 g

一步一步学会puppet(三)--节点和模板

这篇主要介绍puppet中需要理解的2个重要概念:节点和模板: =================================================================== 1 节点 1.1 定义 1.2 详细说明 1.3 实例 2 模板 2.1 定义 2.2 详细说明 2.3 模板文件的语法 2.4 模板文件实例 2.5 使用模板文件生成实际配置文件 ===========================================================

luogu P4245 【模板】任意模数NTT MTT

Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) #define maxn 1000000 #define M 32768 #define double long double #define ll long long using namespace std; namespace poly{ const double pi=acos(-1); int rev[

NTT 模板

其实和 \(FFT\) 就是一个模子里刻出来的一样, \(FFT\) 的优化是基于它的单位根 而 \(NTT\) 的模数通常有一个原根, 和 \(FFT\) 的单位根有类似的性质 还是存个模板 模板题 #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 3000010 using namespace std; typedef l

asp.net mvc 之旅—— 第三站 路由模板中强大的自定义IRouteConstraint约束

我们在写mvc的时候,经常会配置各种url模板,比如controller,action,id 组合模式,其实呢,我们还可以对这三个参数进行单独的配置,采用的方式自然 就是MapRoute中的constraints属性. 一:简单的正则匹配 正则匹配算是最最简单的一个方法,比如针对上面路由中id的值,我可以用正则进行限定,也就是说id只能是整数,这个可以做到吗???对这么扩展性极强的mvc, 当然可以做到,比如我下面写的这样: routes.MapRoute( name: "Default&quo

Django 第三课 【模板】

## 模板 在之前的章节中 ,视图函数只返回文本,而实际上生产环境中其实很少这样用,因为实际的页面大多数是带有样式的HTML代码,这可以让浏览器渲染出非常漂亮的页面.目前市面上有非常多的模板系统.其中最知名最好用的就是DTL 和Jinja2.DTL 是Django Temlate Language 三个单词的缩写.也就是Django自带的模板语言.当然也可以配置Django支持Jinja2等其他模板引擎,但是作为Django内置的模板语言,和Django可以达到无缝衔接而不会产生一些不兼容的情况