单位根反演学习小记

裸题:
bzoj3328

在学习这个之前建议对FFT中的求和引理有一定的了解。

单位根反演就是对:
∑ i ∣ k C n i ( m o d   p ) \sum_{i|k}C_{n}^i(mod~p) ikCni(mod p)进行变换,
p是质数, k ∣ p − 1 k|p-1 kp1,n比较大

m o d   p mod~p mod p下的原根为g, w = g ( p − 1 ) / k w=g^{(p-1)/k} w=g(p1)/k,k比较小

w的含义就是k次单位复数根,不过这里的根不是复数,而是mo意义下类似的一个东西。

w的性质是 w 0 − k − 1 w^{0-k-1} w0k1互不相同,且 w i = w i   m o d   k w^{i}=w^{i~mod~k} wi=wi mod k

单位根反演就是:
1 k ∑ i = 0 k − 1 w i j = [ j ∣ k ] {1\over k}\sum_{i=0}^{k-1}w^{ij}=[j|k] k1i=0k1wij=[jk]

我们来尝试证明这个结论:
1.j|k
w j = 1 w^j=1 wj=1,那么左式=1,成立。

2.j不整除k
w j ≠ 1 w^j≠1 wj̸=1,于是左式可以等比数列求和:
s u m i = 0 k − 1 ( w j ) i sum_{i=0}^{k-1}(w^j)^i sumi=0k1(wj)i
= w j k − 1 w j − 1 ={w^{jk}-1\over w^j-1} =wj1wjk1
1 − 1 w j − 1 = 0 {1-1\over w^j-1}=0 wj111=0

那么也是对的。

那么我们做一下这个裸题:
A n s = ∑ i = 0 n / k C n i k ∗ F ( i k ) Ans=\sum_{i=0}^{n/k}C_{n}^{ik}*F(ik) Ans=i=0n/kCnikF(ik)
= 1 k ∑ i = 0 n C n i ∗ F ( i ) ∗ ∑ j = 0 k − 1 w i j ={1\over k}\sum_{i=0}^nC_{n}^{i}*F(i)*\sum_{j=0}^{k-1}w^{ij} =k1i=0nCniF(i)j=0k1wij
内层外移:
= 1 k ∑ j = 0 k − 1 ∑ i = 0 n C n i ∗ F ( i ) ∗ w j i ={1\over k}\sum_{j=0}^{k-1}\sum_{i=0}^nC_{n}^{i}*F(i)*w_{j}^i =k1j=0k1i=0nCniF(i)wji
斐波拉契第i项可以写成一个2*2的矩阵的i次方的每一个位置的值,不妨设这个矩阵是A
= 1 k ∑ j = 0 k − 1 ∑ i = 0 n C n i ∗ A i ∗ ( w j ) i ={1\over k}\sum_{j=0}^{k-1}\sum_{i=0}^nC_{n}^{i}*A^i*(w^{j})^i =k1j=0k1i=0nCniAi(wj)i
第二个循环可以二项式反演:
1 k ∑ j = 0 k − 1 ( ( A ∗ w j ) k + I ) n {1\over k}\sum_{j=0}^{k-1}((A*w^j)^k+I)^n k1j=0k1((Awj)k+I)n

复杂度: O ( 8 k ∗ l o g n ) O(8k*log n) O(8klogn)

你可能感兴趣的:(模版,数论杂集)