题目描述
从 [ 0 , n ) [0,n) [0,n) 这 n n n 个整数中选出 k k k 个,使得其和为 n n n 的倍数,求方案数。
数据范围与提示
k ≤ 1 0 3 , n ≤ 1 0 9 k\le 10^3,\;n\le 10^9 k≤103,n≤109 。显然总方案数是 ( n k ) {n\choose k} (kn) 。
前置知识:单位根反演。
[ k ∣ n ] = 1 k ∑ i = 0 k − 1 ( ω k n ) i [k\mid n]={1\over k}\sum_{i=0}^{k-1}(\omega_k^{\;n})^i [k∣n]=k1i=0∑k−1(ωkn)i
其中 ω k \omega_{k} ωk 为 k k k 次单位复根。正确性比较显然,若 k ∣ n k\mid n k∣n 则 ω k n = 1 \omega_k^{\;n}=1 ωkn=1 式子成立;若 k ∤ n k\nmid n k∤n 则等比数列求和有 ∑ i = 0 n − 1 ω k i n = ω k k n − 1 ω k n − 1 = 0 \sum_{i=0}^{n-1}\omega_{k}^{\;in}={\omega_k^{\;kn}-1\over \omega_k^{\;n}-1}=0 ∑i=0n−1ωkin=ωkn−1ωkkn−1=0 。
这是一个组合问题。考虑 生成函数 求解。有两个限制,所以用二元的, y y y 表示个数, x x x 表示和。下文均用 [ [ x i ] ] f ( x ) \big[[x^i]\big]f(x) [[xi]]f(x) 表示关于 x x x 的多项式 f ( x ) f(x) f(x) 中 x i x^i xi 的系数。
a n s = [ [ y K ] ] ∑ i = 0 + ∞ [ n ∣ i ] [ [ x i ] ] ∏ j = 0 n − 1 ( 1 + x j y ) ans=\big[[y^K]\big]\sum_{i=0}^{+\infty}\big[n\mid i\big]\big[[x^i]\big]\prod_{j=0}^{n-1}(1+x^jy) ans=[[yK]]i=0∑+∞[n∣i][[xi]]j=0∏n−1(1+xjy)
然后直接单位根反演。(可是为啥要这样做呢……)
a n s = [ [ y K ] ] 1 n ∑ i = 0 + ∞ [ [ x i ] ] ∑ k = 0 n − 1 ω n i k ∏ j = 0 n − 1 ( 1 + x j y ) ans=\big[[y^K]\big]\frac{1}{n} \sum_{i=0}^{+\infty}\big[[x^i]\big] \sum_{k=0}^{n-1}\omega_n^{\;ik} \prod_{j=0}^{n-1}(1+x^jy) ans=[[yK]]n1i=0∑+∞[[xi]]k=0∑n−1ωnikj=0∏n−1(1+xjy)
(话说我会对连续出现的很多 ∏ , ∑ \prod,\sum ∏,∑ 搞昏。为了让我自己下次不头晕眼花,我再写两笔。)这个式子可以这样去想, G ( x ) = ∏ j = 0 n − 1 ( 1 + x j y ) G(x)=\prod_{j=0}^{n-1}(1+x^jy) G(x)=∏j=0n−1(1+xjy) 是客观存在的(先把 y y y 当常数)。然后对于每组 i , k i,k i,k 都要累加 [ [ x i ] ] G ( x ) ⋅ ω n i k \big[[x^i]\big]G(x)\cdot \omega_{n}^{\;ik} [[xi]]G(x)⋅ωnik 的值。
改变枚举顺序。
a n s = [ [ y K ] ] 1 n ∑ k = 0 n − 1 ∑ i = 0 + ∞ [ [ x i ] ] ω n i k ∏ j = 0 n − 1 ( 1 + x j y ) ans=\big[[y^K]\big]\frac{1}{n} \sum_{k=0}^{n-1}\sum_{i=0}^{+\infty}\big[[x^i]\big]\omega_{n}^{\;ik}\prod_{j=0}^{n-1}(1+x^jy) ans=[[yK]]n1k=0∑n−1i=0∑+∞[[xi]]ωnikj=0∏n−1(1+xjy)
如果我给你看这个式子 ∑ i = 0 + ∞ [ [ x i ] ] G ( x ) ⋅ x 0 i \sum_{i=0}^{+\infty}\big[[x^i]\big]G(x)\cdot x_0^{\;i} ∑i=0+∞[[xi]]G(x)⋅x0i 你立刻就意识到,这就是 G ( x 0 ) G(x_0) G(x0) 的 定义式 啊!可是你看到的是 [ [ x i ] ] ( ω n k ) i ∏ j = 0 n − 1 ( 1 + x j y ) \big[[x^i]\big](\omega_n^{\;k})^i\prod_{j=0}^{n-1}(1+x^jy) [[xi]](ωnk)i∏j=0n−1(1+xjy) 怎么就反应不过来了呢?
a n s = [ [ y K ] ] 1 n ∑ k = 0 n − 1 ∏ j = 0 n − 1 ( 1 + ω n k j y ) ans=\big[[y^K]\big]\frac{1}{n}\sum_{k=0}^{n-1}\prod_{j=0}^{n-1}(1+\omega_n^{\;kj}y) ans=[[yK]]n1k=0∑n−1j=0∏n−1(1+ωnkjy)
单位根有很多 a w e s o m e \rm awesome awesome 的性质。枚举 gcd ( k , n ) = d \gcd(k,n)=d gcd(k,n)=d 来进一步化简式子。
a n s = [ [ y K ] ] 1 n ∑ d ∣ n ∑ d ∣ k k < n ∏ j = 0 n − 1 ( 1 + y ⋅ ω n / d j k / d ) [ gcd ( k , n ) = d ] ans=\big[[y^K]\big]\frac{1}{n}\sum_{d|n} \sum_{d|k}^{k
显然 j j j 有 n / d n/d n/d 的循环(毕竟是 ω n / d \omega_{n/d} ωn/d 嘛),所以
a n s = [ [ y K ] ] 1 n ∑ d ∣ n ∑ d ∣ k k < n [ gcd ( k , n ) = d ] [ ∏ j = 0 n d − 1 ( 1 + y ⋅ ω n / d j k d ) ] d ans=\big[[y^K]\big]\frac{1}{n}\sum_{d|n}\sum_{d|k}^{k
把里面这玩意儿化简一下
∏ j = 0 n d − 1 ( 1 + y ⋅ ω n / d j k d ) = ∏ j = 0 n d − 1 ( 1 + y ⋅ ω n / d j ) = ω n / d n d ( n d − 1 ) / 2 ∏ j = 0 n d − 1 ( ω n / d n d − j + y ) = ( − 1 ) n d − 1 ∏ j = 0 n d − 1 ( y − ω n / d j ) \begin{aligned} \prod_{j=0}^{ {n\over d}-1}(1+y\cdot\omega_{n/d}^{\;j{k\over d}}) &=\prod_{j=0}^{ {n\over d}-1}(1+y\cdot\omega_{n/d}^{\;j})\\ &=\omega_{n/d}^{ {n\over d}({n\over d}-1)/2}\prod_{j=0}^{ {n\over d}-1}(\omega_{n/d}^{ {n\over d}-j}+y)\\ &=(-1)^{ {n\over d}-1}\prod_{j=0}^{ {n\over d}-1}(y-\omega_{n/d}^{\;j}) \end{aligned} j=0∏dn−1(1+y⋅ωn/djdk)=j=0∏dn−1(1+y⋅ωn/dj)=ωn/ddn(dn−1)/2j=0∏dn−1(ωn/ddn−j+y)=(−1)dn−1j=0∏dn−1(y−ωn/dj)
j ⋅ k d j\cdot{k\over d} j⋅dk 在模 n d {n\over d} dn 意义下就会取遍 [ 0 , n d ) [0,{n\over d}) [0,dn) ,毕竟 k / d k/d k/d 与 n / d n/d n/d 互质。所以第一个等号成立。第二个等号是直接提出来。第三个等号是 n d − j {n\over d}-j dn−j 取遍 [ 0 , n d ) [0,{n\over d}) [0,dn) ,而这跟 − ω n / d j = ω n / d n / 2 d + j -\omega_{n/d}^{\;j}=\omega_{n/d}^{n/2d+j} −ωn/dj=ωn/dn/2d+j 一个范围。
然后内部的累乘大家都知道,因式定理嘛。所以这个式子就是 ( − 1 ) n d − 1 ( y n / d − 1 ) (-1)^{ {n\over d}-1}(y^{n/d}-1) (−1)dn−1(yn/d−1) 嘛。
a n s = [ [ y K ] ] 1 n ∑ d ∣ n ( − 1 ) n − d ( y n d − 1 ) d ⋅ φ ( n d ) ans=\big[[y^K]\big]\frac{1}{n}\sum_{d|n}(-1)^{n-d}(y^{n\over d}-1)^d\cdot\varphi\left({n\over d}\right) ans=[[yK]]n1d∣n∑(−1)n−d(ydn−1)d⋅φ(dn)
可以二项式定理直接算出 [ [ y K ] ] \big[[y^K]\big] [[yK]] 为
( − 1 ) n − K d n ( d K d n ) φ ( n d ) (-1)^{n-{Kd\over n}}{d\choose {Kd\over n}}\varphi\left({n\over d}\right) (−1)n−nKd(nKdd)φ(dn)
求 n n n 的所有因数的 φ \varphi φ 是均摊 O ( 1 ) \mathcal O(1) O(1) 的。考虑到 K d n ≤ K {Kd\over n}\le K nKd≤K 就 O ( K ) \mathcal O(K) O(K) 暴力算吧……复杂度
O ( K n ) \mathcal O(K\sqrt{n}) O(Kn)