FFT&NTT
FFT
DFT
单位根定义
得到
单位根性质
令
得到
每一项系数
IDFT
把DFT
的过程写成矩阵的形式
尝试得到左边矩阵(记为 精心构造得到:
发现若
所以得到
即
把IDFT
的系数取倒数(即直接虚部取相反数)做一遍DFT
再除以
NTT
对于一个质数
,其原根 满足 在模 意义下两两不同
所以
这就需要
因为
看上去都没什么问题
所以 DFT 等操作的写法和 FFT 基本等价
HDU 6067
每次更改一个多项式的一项系数
对于其点值表示的影响可以顺次算出来
再算一个所有多项式的对应的
因为可能有
最后求
过了这题才发现一直以来的`NTT``的单位根都处理反了...
一开始以为NTT
长度只用到 NTT
长度是
记得去掉第
这题模数小最好预处理逆元到
cf286E
每个能表示出来的数一定能被至多两个数表示出来,否则假如只能由
相当于这个集合对加法封闭
直接对集合里出现的数做集合幂级数再并上一个
考虑每一位:
如果原来为
现在不为 那么这个集合不是封闭的输出NO
如果原来不为
现在为 不可能因为 次项是如果原来为
现在也为 不影响如果原来不为
现在也不为 那么看它的值是否是 是的话就只能是 和 凑出来,这个数就必选;否则一定有两个非零的和为 ,这个数可以被其他数表示出来所以不必选
BZOJ4836 二元运算
在值域上分治,每次直接算两遍左边卷右边的东西贡献到答案数组上
最后每次
cf553E Kyoya and Train
设
则
令后者为
转移就成了
然后这个
是一个卷积的形式,直接分治 fft 就搞完了
然后记得当把
注意边界的最小最大值各取什么,不要想着有clang++
查错,一个边界的小问题可能卡半个多小时
BZOJ4451 Frightful Formula
这已经可以直接任意模数NTT
做了,只是常数大
由于这题的形式特殊,尝试再推一些东西
令
则上面那个东西就是
边界是
后两项是类似的,以
边界
得到
当
同理
然后递推的时候直接
cf958F
相当于求一堆
直接分治FTT
常数可能有点问题
改成启发式合并,用个堆维护当前最小的多项式的
cf623E
每个数至少使“前缀或”多一位的 puts("0")
所以现在
感觉其他人搞得状态有点麻烦就自己搞了一种(然后发现差不多麻烦)
令
最后答案就是
一开始想的转移是
然后发现这个转移太慢了,每次似乎可以转移多个数:
那个
然后高兴地打了个分治,然后样例就挂了
因为这个
所以
转移即为
然后又调了一年:
fft
精度差要+0.5每次
时精度丢失也很严重