首页 > TAG信息列表 > NTT

NTT(快速数论变换)

NTT(快速数论变换) 在取模的情况下,解决多项式乘法. n,m表示多项式的次数,从低到高读入 const int NR = 1 << 22, g = 3, gi = 332748118, mod = 998244353; //998244353的一个原根为3且998244353-1=2^23*119,3在模998244353意义下的逆元为332748118 int n, m, rev[NR]; //rev[i]为

无语了

大家觉得我是这样的人嘛,一言不合就把我p上去,还说我不看镜头很正常....属实是ntt 不就吐槽了一下这个人嘛......害,p完之后还去整了个清晰版,无法理解......

fft && ntt 模板

fft参考blog ntt参考blog FFT模板 点击查看代码 #include<bits/stdc++.h> using namespace std; template<typename T> inline void read(T &x){ x=0;T fl=1;char tmp=getchar(); while(tmp<'0'||tmp>'9')fl=tmp=='-'?-fl:fl,tmp=

随便写点东西

学习多项式求逆的过程中,看着自己的代码怎么看怎么像是\(O(nlog^2n)\) 的,然后看到了大佬的写法: void solve(LL *a,LL *b,int p){/*a:seq,b:inv*/ if(p==1){ b[0]=fpm(a[0],MOD-2); return; } solve(a,b,(p+1)>>1); lim=1; L=0; while(lim<(p<<1)){ lim<<=1; L++; }

NTT

质数模数 NTT 普通 FFT 有一个很大缺点就是精度和随带的速度 因为一直是在复数域,大量的 double 运算,精度的损失太大了,所以出现了 NTT (快速数论变换) NTT 的思想和 FFT 的思想是一样的,只是将原根换成了一个替代品\(\to\)关于模数的原根 倒数的地方就是原根关于模数的逆元

FFT&NTT

快速傅里叶变换(Fast-Fourier-Transform)  已知多项式$A(x)=\sum _{i=0}^{N} a_ix^i,B(x)=\sum _{i=0}^{M} b_ix^i$求$A(x)*B(x)$.   显然看出可以枚举两个多项式的系数,依次算出,时间$O(nm)$.   太慢了!!怎么办?利用一个奇妙的东西:FFT 多项式的点值表示法     对于一个多

CF1667E Centroid Probabilities

题面传送门 写了个NTT然后被一堆到现在还看不懂的线性做法吊起来打。 首先我们考虑直接对重心的充要条件下手:当前节点的孩子的子树不超过\(\frac{n}{2}\)且总和大于\(\frac{n}{2}\) 先考虑设\(g_i\)表示一颗\(i\)个点的树,且没有一个子树大小超过\(\frac{n}{2}\)的方案数。发现可以

四大变换学习笔记(FFT,NTT,FMT,FWT)

FFT 介绍 FFT 之前,我们先介绍一下多项式。 多项式 多项式的概念 多项式是一个形如 \(A(x)=a_0+a_1x+a_2x^2+a_3x^3+\cdots+a_nx^n\) 的式子,我们称此时的 \(A(x)\) 为一个 \(n\) 次多项式,用更数学的语言来讲就是: \[A(x)=\sum_{i=0}^na_ix^i \]可以发现 \(A(x)\) 的本质是一个函数,所

FFT/NTT学习笔记

这是很大的东西,这里只是初学的一些简单题罢了...... 以下不区分 FFT 与 NTT 分治 FFT 我们知道,常规的卷积是这样: \[h_{i}=\sum_{j=0}^{i}f_jg_{i-j} \]然而很多时候,我们的数列是由自身递推而来的,或者说,形如: \[f_{i}=\sum_{j=0}^{i-1}f_{j}g_{i-j} \]运用 cdq 分治 + FFT ,我们可以

4.4省选练习

\(4.4\)省选练习 \(T1\) 很能递推的样子,模数一眼\(NTT,\)那么大概就是乘上一个转移多项式了 我们要求多少个被染色的块权值 考虑每一维分开处理,假设我们现在得到了前\(i-1\)维度的状态,我们现在增加一个维度 然后分成两种情况 \(a_i\neq 1,f[i]=f[i-1]\times 2,f[i]=f[i]\times(

NTT

来,背 稍微提一下原根的求法,我们对于模数(p-1)质因数分解,然后暴力枚举原根,我们发现原根满足 \(^{n}_{i=1}g^{\frac{p-1}{p_i}}\not\equiv 1(mod\ p)\) 就没了。 然后就是模数需要满足是\(X\times 2_n+1\) 的形式,否则上任意模数NTT #include<bits/stdc++.h> using namespace std; #d

数论变换NTT

目录0. 前言原根Number Theoretic TransformsInverse Number Theoretic Transforms 0. 前言 我们在学Fast Fourier Transforms的时候就会发现输出栏有res[i]=(unsigned long)(a[i].real()/limit+.5) 这里需要加上\(0.5\)以保证输出精度 输出精度是怎么产生的呢? 我们用复数运算,这

『学习笔记』FFT与NTT

这个傻逼目录为什么挂了啊?? 中文名:快速傅里叶离散变换、快速数论变换 英文名:fast fast tle FFT,NTT 之前看这东西看了好久没看懂,回来看原来只是几个无脑操作 前置芝士:三角函数基础(FFT)、原根(NTT) \(\mathtt {FFT}\) 部分 1. 胡扯 假如现在给你两个多项式 \(f,g\) ,怎么算出它们的

快速数论变换(NTT)

快速数论变换(NTT) 这东西之前就想学了,一直没有动手 orz,现在补一下。 学这东西我感觉并没有很多新知识,学之前掌握 FFT 就好了。 FFT 可以在这里看看:https://www.cnblogs.com/Tenshi/p/15434004.html NTT,是用来解决多项式乘法取模问题的,因为 FFT 可能在精度上不够,而且常数较大,因此

数论变换(NTT)

CRT 令 R R R是基环 (base ring),那么 R [ x ]

多项式板子

#include <iostream> using namespace std; #define ll long long const ll N = 1e5+50; namespace NTT{ const int P[3] = {469762049, 998244353, 167772161},//模数 G = 3, //原根 Gi[3] = {P[0] / G + 1, P[1] / G + 1, P[2] / G + 1};//逆元 int R[N];

牛客挑战赛53G-同源数组(Easy Version)【NTT】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11193/G 题目大意 给出\(n\)个长度为\(m\)的数组,然后你每次可以进行差分(不会改变数组长度那种)和前缀和。 如果两个数组可以在模\(998244353\)意义下操作成同一个数组,那么这两个同源,求所有的同源数组。 \(1\leq n\leq 100,1\le

NFLSOJ #10319. -「2020联考北附2」碎梦(NTT+对角化)

题面传送门 一个奇怪的解法,时间复杂度比标算少一个 \(k^2m\) 所以建议把数据范围加强到 \(k=300,m=3\times 10^4\),8s 时限把标算卡掉(bushi) 首先考虑部分分解法。对于 \(m=100\),注意到转移可以写成矩阵的形式,具体来说记 \(A=\begin{bmatrix}0&1&0&0&\cdots&0&0\\0&1&1&0&\cdots&0&0

P6295-有标号 DAG 计数【多项式求逆,多项式ln】

正题 题目链接:https://www.luogu.com.cn/problem/P6295 题目大意 求所有\(n\)个点的弱联通\(DAG\)数量。 \(1\leq n\leq 10^5\) 解题思路 先不考虑弱联通的限制,求\(n\)个点的\(DAG\)数量。 设为\(f_i\),那么有式子 \[f_n=\sum_{i=1}^{n}\binom{n}{i}2^{i(n-i)}f_{n-i}(-1)^{i+1}

2021牛客暑期多校训练营9C-Cells【LGV引理,范德蒙德行列式】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11260/C 题目大意 一个平面上,\(n\)个起点\((0,a_i)\)分别对应终点\((i,0)\),每次只能往上或者往左走。求不交路径数。 \(1\leq n\leq 5\times 10^5,a_i<a_{i+1},a_n\leq 10^6\) 解题思路 看起来很\(LGV\)引理,先列出行列式 \[F

Loj#6503-「雅礼集训 2018 Day4」Magic【分治NTT】

正题 题目链接:https://loj.ac/p/6503 题目大意 \(n\)张卡\(m\)种,第\(i\)种卡有\(a_i\)张,求所有排列中有\(k\)对相邻且相同的卡牌。 \(1\leq n\leq 10^5,0\leq k\leq 10^5,1\leq m\leq 20000,\sum_{i=1}^ma_i=n\) 解题思路 \(k\)对相邻的相同,就是可以分成有\(n-k\)组相同的。 考

多项式板子

自己手摸的一套多项式板子,似乎常数并不是很优秀,优化中 默认模数P为998244353 namespace Poly{ void FWT_or(int *a,int len,int Ty){ for(int w=1;w<len;w<<=1) for(int j=0;j<len;j+=w*2) rep(i,0,w-1)a[i+j+w]+=a[i+j]*Ty; } void FWT_and(int *a,int len,int Ty){

FFT/NTT字符串模糊匹配

因为FFT精度问题太离谱了,所以墙裂推荐用NTT 首先考虑精确匹配:https://www.acwing.com/problem/content/833/ 假设我们有短串\(s1\)(长度为\(n\)),长串\(s2\)(长度为\(m\)) 我们定义字符差 \[c(x,y) = s1(x) - s2(y) \]若\(c(x,y) = 0\),表明\(s1\)的第\(x\)个字符与\(s2\)的第\(y\)个

NTT

单位根的定义就不说了。 显然有: \[\omega_n^k=\cos {2\pi k \over n}+i\sin {2\pi k \over n} \]带入这个可以直接证得: \[\omega_{2n}^{2k}=\cos {2\pi \cdot 2k \over 2n}+i\sin {2\pi \cdot 2k \over2 n}=\omega_n^k \]我们用图像理性理解可得(就是绕着原点把向量转了180度): \[\om

P5644-[PKUWC2018]猎人杀【NTT,分治】

正题 题目链接:https://www.luogu.com.cn/problem/P5644 题目大意 n n n个人,每个人被选中的权重是 a i