KarL05/Aiyiyi's Blog
闲题解答 1

闲题解答 | 营业日记

有朋友问我一道题: 对于一个集合{1,2,3,4.....,N}, 求有多少子集使得子集内元素和是N的倍数。

很久没做题了,就做做试试。感觉是一道纯数学题,但我数学不好,可是数数说不定能数出来,感觉形式很生成函数。因此,先把问题具体化,即求

\[ A = \sum_k [x^{kN}]\prod_{i=1}^N (x^i+1) \]

然后看起来可能是单位根反演,那就试试:令 \[ w = \cos(2\pi/n)+i\sin(2\pi/n)\]

套用单位根反演去掉第一个符号可以得到:

\[ A = \frac{1}{N}\sum_{k=1}^N \prod_{i=1}^N (w^{ki}+1) \]

首先这是数学竞赛题,肯定不能直接开始死算。敏锐的

观察到:

\[ 1-z^n = \prod_k (-w^{k}+z) \]

带入 \(z=-1\) 得到

\[ 1-(-1)^n = \prod_k (-w^k-1) = (-1)^n\prod_k (w^k+1) \]

所以

\[ f(n) = \frac{1-(-1)^n}{(-1)^n} = \prod_k (w^k+1) \]

观察到如果 n 是奇数 \(f(n) = 2\), 要不然就是 0. 特殊情况 \(f(1) = 2^N\). (因为没有复数了)

可以直接带入吗?不能。因为这里似乎默认了 \(N\) 是质数。如果 \(N\) 不是,那么其实这种"循环节"不是常数。也就是乘以 \(i\) 的影响是有意义的。

乘以 \(i\) 其实就会导致带入式子中的 \(n\) 变小。这里有一个类似 burnside 的想法,考虑如果有 6 个单位根,然后选择一个复角 120 度的单位根,其实是 \(2f(3)\) 而不是 \(f(6)\).

具体好像和最大公约数有关,感觉和 burnside 很像,如果 \((N,k) \not = 1\), 那就直接取 \(\frac{N}{k} f(\frac{N}{(N,k)})\) (好像很有道理的样子?)

那就直接求和,

\[ A = \frac{1}{N}\sum_{k=1}^N (N,k) f(\frac{N}{(N,k)}) \]

\(f(X) = 2\) 当且仅当 \(X\) 里的 \(2\) 的因数被除干净了吧?那就是 \(2^{v_2(N)}|(N,k)\) 的时候吧?

那么 \(k\) 的选择只能是 \(t=2^{v_2(N)}\) 的倍数吧?也就是

\[ A = \frac{2t}{N}\sum_{k=1}^{N/t}(N/t,k) \]

最后补个项时因为可能 \(w = 1\) 也就是不参与复数的操作的时候。

那就莫比乌斯反演就好了吧?这不就是 polya 和 burnside 的关系吗? 可是我没有背过 Polya 的结论,那就自己推一遍吧。

\[ A = \frac{2t}{N}\sum_d \sum_{k=1}^{N/td}d[(k,N/td)=1] \]

\[ A = \frac{2t}{N}\sum_{d|N} d\sum_{k=1}^{N/td}[(k,N/td)=1] \]

\[ A = \frac{2t}{N}\sum_{d|N} d\phi(N/td) \]

使用黎曼函数那套生成函数法玩一玩可以得到, (最后别忘了 \(2^N-1\))

\[ \boxed{A = \frac{2t}{N}( [z^{\frac{N}{2^{v_2(N)}}}] \frac{\zeta^2(z-1)}{\zeta(z)}+2^N-1)} \]