数数题

题目

题目描述
[ 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 k103,n109 。显然总方案数是 ( 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 [kn]=k1i=0k1(ωkn)i

其中 ω k \omega_{k} ωk k k k 次单位复根。正确性比较显然,若 k ∣ n k\mid n kn ω k    n = 1 \omega_k^{\;n}=1 ωkn=1 式子成立;若 k ∤ n k\nmid n kn 则等比数列求和有 ∑ 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=0n1ωkin=ωkn1ωkkn1=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+[ni][[xi]]j=0n1(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=0n1ωnikj=0n1(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=0n1(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=0n1i=0+[[xi]]ωnikj=0n1(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)ij=0n1(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=0n1j=0n1(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}^{kans=[[yK]]n1dndkk<nj=0n1(1+yωn/djk/d)[gcd(k,n)=d]

显然 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}^{kans=[[yK]]n1dndkk<n[gcd(k,n)=d]j=0dn1(1+yωn/djdk)d

把里面这玩意儿化简一下
∏ 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=0dn1(1+yωn/djdk)=j=0dn1(1+yωn/dj)=ωn/ddn(dn1)/2j=0dn1(ωn/ddnj+y)=(1)dn1j=0dn1(yωn/dj)

j ⋅ k d j\cdot{k\over d} jdk 在模 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 dnj 取遍 [ 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)dn1(yn/d1) 嘛。
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]]n1dn(1)nd(ydn1)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)nnKd(nKdd)φ(dn)

n n n 的所有因数的 φ \varphi φ 是均摊 O ( 1 ) \mathcal O(1) O(1) 的。考虑到 K d n ≤ K {Kd\over n}\le K nKdK O ( K ) \mathcal O(K) O(K) 暴力算吧……复杂度
O ( K n ) \mathcal O(K\sqrt{n}) O(Kn )

你可能感兴趣的:(数学,#,欧拉函数,#,多项式/生成函数)