Intro: 本篇博客将会从朴素乘法讲起,经过分治乘法,到达FFT和NTT 旨在能够让读者(也让自己)充分理解其思想 模板题入口:洛谷 P3803 [模板]多项式乘法(FFT) 朴素乘法 约定:两个多项式为\(A(x)=\sum_{i=0}^{n}a_ix^i,B(x)=\sum_{i=0}^{m}b_ix^i\) Prerequisite knowledge: 初中数学知识(手动滑稽) 最简单的多项式方法就是逐项相乘再合并同类项,写成公式: 若\(C(x)=A(x)B(x)\),那么\(C(x…
[简介] 快速傅里叶变换(FFT)运用了单位复根的性质减少了运算,但是每个复数系数的实部和虚部是一个余弦和正弦函数,因此系数都是浮点数,而浮点数的运算速度较慢且可能产生误差等精度问题,因此提出了以数论为基础的具有循环卷积性质的快速数论变换(NTT). 在FFT中,通过$n$次单位复根即$\omega^n=1$的$\omega$来运算,而对于NTT来说,则是运用了素数的原根来运算. [原根] [定义] 对于两个正整数$a,m$满足$gcd(a, m)=1$,由欧拉定理可知,存在正整数$d\leq…
具体步骤: 1.补0:在两个多项式最前面补0,得到两个 $2n$ 次多项式,设系数向量分别为 $v_1$ 和 $v_2$. 2.求值:用FFT计算 $f_1 = DFT(v_1)$ 和 $f_2=DFT(v_2)$.这里得到的 $f_1$ 和 $f_2$ 分别是两个输入多项式在 $2n$ 次单位根处的各个取值(即点值表示) 3.乘法:把两个向量 $f_1$ 和 $f_2$ 的每一维对应相乘,得到向量 $f$.它对应输入多项式乘积的点值表示. 4.插值:用FFT计算 $v=IDFT(f)$,其实…
Huffman分治的NTT,常数一般.使用的时候把多项式的系数们放进vector里面,然后调用solve就可以得到它们的乘积.注意这里默认最大长度是1e6,可能需要改变. #include<bits/stdc++.h> using namespace std; typedef long long ll; int a[200005], b[200005], btop; const int MAXN = 1e6, MAXLOGN = 20, mod = 998244353; int add_mod…
http://172.20.6.3/Problem_Show.asp?id=2041 https://blog.csdn.net/ggn_2015/article/details/68922404 代码 https://blog.csdn.net/zz_1215/article/details/40430041 证明 这道题里只用快速幂就好了,抄的代码用的exgcd求的逆元,所以我也用的exgcd(权当复习了,exgcd倒推回去的时候记着只需要联立等式,每次自己推exgcd都会想太多……),其实…
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> #define maxn 1010 using namespace std; char s[maxn]; typedef long long ll; ll A[maxn], B[maxn]; const int md = 998244353, G = 3; int n; ll power_mod(ll a, ll b){ ll ret = 1; while(b > 0){ if(b & 1)ret…
这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+1 个整数,表示第一个多项式的 00 到 nn 次项系数. 第三行 m+1m+1 个整数,表示第二个多项式的 00 到 mm 次项系数. 输出格式 一行 n+m+1n+m+1 个整数,表示乘起来后的多项式的 00 到 n+mn+m 次项系数. 样例一 input 1 2 1 2 1 2 1 output 1 4 5 2 explanation (1+…
NTT 在FFT中,我们需要用到复数,复数虽然很神奇,但是它也有自己的局限性--需要用double类型计算,精度太低 那有没有什么东西能够代替复数且解决精度问题呢? 这个东西,叫原根 原根 阶 若\(a,p\)互素,且\(p>1\), 对于\(a^n \equiv 1 \pmod{p}\)最小的\(n\),我们称之为\(a\)模\(p\)的阶,记做\(\delta_p(a)\) 例如: \(\delta_7(2)=3\), \(2^1 \equiv 2 \pmod{7}\) \(2^2 \equ…
FFT可以用来计算多项式乘法,但是复数的运算中含有大量的浮点数,精度较低.对于只有整数参与运算的多项式,有时,\(\text{NTT(Number-Theoretic Transform)}\)会是更好的选择. 原根 阶 若\(a,p\)互素,且\(p>1\),对于\(a^k \equiv 1 (\mod p)\)的最小的\(k\),称为\(a\)模\(p\)的阶,记做\(\sigma_p(a)\). \(E.g.\) \(\sigma_7(2)=3\) \(2^1\equiv 2(\mod 7…