单位根反演学习笔记
单位根反演
用途
求多项式特定次数(为某个数倍数)的和,比如位数之和膜某个数的生成函数之和
单位根性质
单位根有一些特殊的性质。考虑要求的式子
[ans=sum_{i=0}^{frac n k}[x^{ik}]f(x)=sum_{i=0}^n[k|i][x^i]f(x)
]
考虑构造函数使得$g(k,i)=[k|i] $
又由于(omega_k^{ij}=omega_k^0=1),且([k ot|~~i])的时候都不等于1,我们考虑利用这一性质。令
[g(k,i)=frac{1}{k}sum_{j=0}^{k-1}omega_k^{ij}
]
证明:除开上述条件成立的情况,其他情况是一个等比数列求和,即
[frac{1}{k} frac{omega_{k}^{ki}-omega_{k}^{0}}{omega_{k}^{i}-1}=0
]
所以(g(k,i)=[k|i])
公式推导
那么我们就可以用单位根来表示这些项的系数和了!
[egin{aligned}
sum_{i=0}^{left[frac{n}{k}
ight]}left[x^{i k}
ight] f(x) &=sum_{i=0}^{n}[k | i]left[x^{i}
ight] f(x) \
&=sum_{i=0}^{n}left[x^{i}
ight] f(x) frac{1}{k} sum_{j=0}^{k-1} omega_{k}^{j i} \
&=frac{1}{k} sum_{i=0}^{n} a_{i} sum_{j=0}^{k-1} omega_{k}^{i j} \
&=frac{1}{k} sum_{j=0}^{k-1} sum_{i=0}^{n} a_{i}left(omega_{k}^{j}
ight)^{i} \
&=frac{1}{k} sum_{j=0}^{k-1} fleft(omega_{k}^{j}
ight)
end{aligned}
]
至于为什么叫做反演呢...我想可能是用了多项式本身来带入构造出来的式子,来表示要求的答案。而且复杂度也正好相反是(O(k imes calc(f)))
然后这个单位根跟FFTNTT的一样,也可以用原根的((p-1)/n)次方来代替。
注意有些题不好求F,也可以只用单位根反演化简([k|i])
例题
dbzoj 3328
令A为递推矩阵,我们要求
[sum_{i=0}^n[k|i] C^i_nA^i
]
[=sum_{i=0}^nfrac 1 ksum_{j=0}^{k-1} omega_k^{ij}C^{i}_nA^i
]
[=frac 1 k sum_{j=0}^{k-1}sum_{i=0}^n C^i_nomega_k^{ij}A^i
]
[=frac 1 ksum_{j=0}^{k-1}(Aomega_k^j+I)^n
]
复杂度(O(tklog n)),注意要找原根。
白兔之舞
目前在做HNOI2017,准备做HNOI2019的时候再写。
upd1 :2017做完了5/6,剩下一道要用EXLUCAS不想写,等我写完就更