NTT模板】的更多相关文章

NTT(快速数论变换)用到的各种素数及原根: https://blog.csdn.net/hnust_xx/article/details/76572828 NTT多项式乘法模板 #include<cstdio> #include<iostream> #include<algorithm> using namespace std; typedef long long LL; ; //119*2^23+1 g=3 <<)+; ; int rev[N]; LL…
自己整理出来的模板 存在的问题: 1.多项式求逆常数过大(尤其是浮点数FFT) 2.log只支持f[0]=1的情况,exp只支持f[0]=0的情况 有待进一步修改和完善 FFT: #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef double db; ); ,M=1e6+,mod=; int n,m,n2,a[N]; int Pow(int x,int p) { ; ,x=(ll)x*x%mod…
题解 可以计算每一项对后面几项的贡献,然后考虑后面每一项,发现这是一个卷积,直接暴力NTT就行了,发现它是一个有后效性的,我们选择使用CDQ分治. Tips:不能像通常CDQ分治一样直接 每次递归两边,然后处理.应该先递归左边,然后处理,再递归右边,保证右边的所有需要的转移已经被计算出来. 参考代码: #include<bits/stdc++.h> using namespace std; const int maxn = 1e5+10; const int p(998244353); int…
@(学习笔记)[FFT, NTT] Problem Description Calculate A * B. Input Each line will contain two integers A and B. Process to end of file. Note: the length of each integer will not exceed 50000. Output For each case, output A * B in one line. Sample Input 1 2…
NTT: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 2000050 #define ll long long #define MOD 998244353 template<typename T> inline void read(T&x) { T f=,c=;char ch=getchar(); ;ch=getchar()…
题目要我们求$f[i]=\sum\limits_{j=1}^{i}f[i-j]g[j]\;mod\;998244353$ 直接上$NTT$肯定是不行的,我们不能利用尚未求得的项卷积 所以要用$CDQ$分治,先递归$[l,mid]$,然后处理$[l,mid]$对$[mid+1,r]$的影响,再递归$[mid+1,r]$ 当我们处理$[l,mid]$对$[mid+1,r]$的影响时,$f[i](i\in [l,mid])$的是已经求完的,所以能用$NTT$卷积 细节比较多,注意不要让$f[i](i\…
51nod 1348 乘积之和 #include <cmath> #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <queue> #include <map> #include <bitset> #include <set>…
#include<bits/stdc++.h>//只是在虚数部分改了一下 using namespace std; typedef long long int ll; ; ; ; ; ll n,m,limit,r[maxn*],len,f[maxn],g[maxn]; ll qpow(ll x,ll y) { ll ans=,base=x; while(y) { )ans=ans*base%mod; base=base*base%mod; y>>=; } return ans; }…
求两个多项式的卷积对任意数p取模 两个好记的FNT模数: 5*2^25+1 7*2^26+1 原根都为3 //Achen #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<vector> #include<cstdio> #include<queue> #include<cmath> #incl…
NTT模板 #include<bits/stdc++.h> using namespace std; #define LL long long const int MAXL=22; const int MAXN=1<<MAXL; const int Mod=998244353; int rev[MAXN],A[MAXN],B[MAXN],C[MAXN]; int fast_pow(int a,int b){ int ans=1; while(b){ if(b&1)ans=1…
以下这份代码并没有过.但感觉没有问题.不是蜜汁WA就是蜜汁T. #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> typedef long long ll; using namespace std; ; , K = ; int i; , G = , g[K+], ng[K+], inv[N+]; ll A[N*+], B[N*+]; ll pow(ll…
luoguP1919 A*B Problem升级版 链接 luogu 思路 ntt模板题 代码 #include <bits/stdc++.h> #define ll long long using namespace std; const int N=3e5+7,mod=998244353; int n,a[N],b[N],limit=1,l,r[N]; ll q_pow(ll a,int b) { ll ans=1; while(b) { if(b&1) ans=ans*a%mod…
A * B Problem Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9413    Accepted Submission(s): 1468 Problem Description Calculate A * B.   Input Each line will contain two integers A and B.…
解题关键:快速数论变换NTT模板. 注意$ans$数组的$ans[n]$一定要注意置$0$,或者结果从$n-1$开始遍历,这里很容易出错. 代码1:ACdreamer 的板子. 为什么要reverse序列至今没证明出来.=,=有懂的聚聚可以告诉本渣一下,万分感谢!!~~ 经过聚聚们的指导,还是不太懂,最终从wiki上找到了比较易懂的证明~ #include<cstdio> #include<cstring> #include<algorithm> #include<…
我这种数学一窍不通的菜鸡终于开始学多项式全家桶了-- 必须要会的前置技能:FFT(不会?戳我:[知识总结]快速傅里叶变换(FFT)) 以下无特殊说明的情况下,多项式的长度指多项式最高次项的次数加\(1\) 一.NTT 跟FFT功能差不多,只是把复数域变成了模域(计算复数系数多项式相乘变成计算在模意义下整数系数多项式相乘).你看FFT里的单位圆是循环的,模一个质数也是循环的嘛qwq.\(n\)次单位根\(w_n\)怎么搞?看这里:[BZOJ3328]PYXFIB(数学)(内含相关证明.只看与原根和…
NTT&FFT 预先知识:无 我觉得我们可以从NTT/FFT讲起? 两个其实本质相同,都是求 多项式乘积 的算法 FFT \((x,y)\)指复数,我们可以不用管它 首先我们构造单位根\(\omega_n\)=\((cos(2\pi/n),sin(2\pi/n))\) 而\((\omega _n)^i=(cos(2\pi/n\cdot i),sin(2\pi/n\cdot i))\) 伟大的数学家们告诉我们\((\omega_n)^n=1\) 也就是说\(\omega_n\)实际上是一个\(n\…
前置芝士 可重集排列 NTT 前置定义 \[\begin{aligned}\\ f_i=C_m^i\cdot \frac{n!}{(S!)^i(n-iS)!}\cdot (m-i)^{n-iS}\\ ans_i=\sum\limits_{j=i}^lim (-1)^{j-i}C_j^i f_j\\ \end{aligned}\] 理解:\(m\)种颜色选i种恰好出现\(S\)次,可重全排列,剩余块染色,不过这样有可能会出现剩余块种有恰好出现\(S\)次的情况,所以容斥一下 \(C_j^i\):\…
打算写一个多项式总结. 虽然自己菜得太真实了. 好像四级标题太小了,下次写博客的时候再考虑一下. 模板 \(FFT\)模板 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <cctype> #include <algorithm> #define rin(i,a,b)…
MTT:任意模数NTT 概述 有时我们用FFT处理的数据很大,而模数可以分解为\(a\cdot 2^k+1\)的形式.次数用FFT精度不够,用NTT又找不到足够大的模数,于是MTT就应运而生了. MTT没有模数的限制,比NTT更加自由,应用广泛,可以用于任意模数或很大的数. MTT MTT是基于NTT的,其思想很简单,就是做多次NTT,每次使用不同的素数,然后使用CRT合并解,在合并的过程中模最终模数,或是对于无模数的情况使用高精度. 做NTT的次数取决于最大可能答案的大小,所用的所有素数之积必…
注:多项式的题目,数组应开:N的最近2的整数次幂的4倍. 多项式乘法 FFT模板 时间复杂度\(O(n\log n)\). 模板: void FFT(Z *a,int x,int K){ static int rev[N],lst; int n=(1<<x); if(n!=lst){ for(int i=0;i<n;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<x-1); lst=n; } for(int i=0;i<…
这篇文章会讲讲FFT的原理和代码. 先贴picks博客(又名FFT从入门到精通):http://picks.logdown.com/posts/177631-fast-fourier-transform 首先FFT是干嘛用的? 额其实在oi中它就是一个用来算"快速卷积"的东西. 卷积是啥? 给定两个数组a.b,求数组c使得: ;i<n;i++) ;j<n;j++) if(i+j<n) c[i+j]+=a[i]*b[j]; 这就叫做长度为n的"卷积"…
推荐阅读资料:算法导论第30章 本文不做证明,详细证明请看如上资料. FFT在算法竞赛中主要用来加速多项式的乘法 普通是多项式乘法时间复杂度的是O(n2),而用FFT求多项式的乘法可以使时间复杂度达到O(nlogn) FFT求多项式的乘法步骤主要如下图 其中求值是将系数表达转换成点值表达,带入的自变量是wn=1的复数解,称为DFT 插值是将点值表达转换成系数表达,称为DFT-1 DFT 和 DFT-1都可以用FFT加速实现 这是递归版的FFT 还有一种非递归的版本 我们发现叶子节点的下表的二进制…
(原稿:https://paste.ubuntu.com/p/yJNsn3xPt8/) 快速傅里叶变换,是求两个多项式卷积的算法,其时间复杂度为$O(n\log n)$,优于普通卷积求法,且根据有关证明,快速傅里叶变换是基于变换求卷积的理论最快算法. 关于FFT的介绍,最详细易懂的是<算法导论>上的内容. 其大致介绍与代码在这里:http://www.cnblogs.com/rvalue/p/7351400.html. 1.FFT&NTT模板 #include<cmath>…
题目链接:acm.hdu.edu.cn/showproblem.php?pid=6589 题意:给出一个长度为n的数组,有m次操作,操作有3种1,2,3,问操作m次后的数组,输出i*a[i]的异或和 操作k的实质是进行一次O(n)的计算,a[i]+=a[i-k] (i-k>0) k=1时,我们可以发现这是一次求前缀和的操作 k=2时,我们可以发现这是对于1,3,5,7... 2,4,6,8...两个子数组分别进行求前缀和的操作 k=3时,我们可以发现这是对于1,4,7,11...2,5,8,12…
前言 众所周知,这两个东西都是用来算多项式乘法的. 对于这种常人思维难以理解的东西,就少些理解,多背板子吧! 因此只总结一下思路和代码,什么概念和推式子就靠巨佬们吧 推荐自为风月马前卒巨佬的概念和定理都非常到位的总结 推荐ppl巨佬的简明易懂的总结 FFT 多项式乘法的蹊径--点值表示法 一般我们把两个长度为\(n\)的多项式乘起来,就类似于做竖式乘法,一位一位地乘再加到对应位上,是\(O(n^2)\)的 如何优化?直接看是没有思路的,只好另辟蹊径了. 多项式除了我们常用的系数表示法\(y=a_…
题目链接 换一下形式:\[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_{i-j}+\sum_{j=mid+1}^rf_jg_{i-j}\] 复杂度\(O(n\log^2n)\). 分治思路见:https://www.cnblogs.com/SovietPower/p/9366763.html 多项式求逆做法先坑着. //693ms 4.91MB #include <…
题目背景 模板题,无背景 题目描述 给定 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​…
题目传送门 多项式乘法 题目描述 给定一个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: 1 2 1 2 1 2 1 输出样例#1: 1 4 5 2 说明 保证输入中的系数大于等于 0 且小于等于9.…
网上相关博客不少,这里给自己留个带点注释的模板,以后要是忘了作提醒用. 以洛谷3803多项式乘法裸题为例. FFT: #include <cstdio> #include <cmath> #include <cctype> #include <algorithm> #define ri readint() #define gc getchar() int readint() { , s = , c = gc; ) c = gc; , c = gc; + c…
NTT裸模板,没什么好解释的 这种高深算法其实也没那么必要知道原理 #include <cstdio> #include <cstring> #include <algorithm> #define N (1<<17)+10 #define ll long long using namespace std; ll inv3,invl; int r[N]; ll A[N],B[N],C[N],mulwn[N],invwn[N]; char s1[N],s2[N…