Description
要求你从Zn(模n的剩余系)里选出k个不重复元素,使得他们的和模n为0。求方案数。
1≤n≤109,1≤k≤103。
Solution
看上去就很像单位根反演的题?
先放一下众所周知的单位根反演的式子: 1nn−1∑i=0(ξin)k=[n|k] 证明很容易:假如有n|k,那么和式中每一项都是1,加起来除n后就事1了(这种情况下等比数列公比为1,所以不可以采用等比数列求和公式);反之,我们采用等比数列求和公式可知原式中的和式为1−ξknn1−ξkn,这个东西的分子为0,那么自然和式左边为0。
那么考虑构造二元答案多项式f(x,y): f(x,y)=n−1∏i=0(1+xiy) 这个多项式的每一项中x的次数表示和,y表示选数的数量。我们显然要求所有含yk且x的次数为n的倍数的项的系数之和,那么考虑将y视为常数,对x进行单位根反演: f(ξtn,y)=n−1∏i=0(1+(ξtn)iy) 观察到如果t和n不互质,那么两者可以同时约去一约数(反之,若有t⊥n,那么称ξtn为一个n次本原单位根)。假设约完之后的单位根为ξba,那么我们发现当积式中枚举的i大于a时,会出现循环。所以我们只需要取循环节(显然长度为a,因为我们知道所有a阶单位根构成一个循环群,而a阶本原单位根一定是该群的生成元。原因事首先显然用ξ1a可以生成所有a阶单位根,所以所有a阶单位根构成一个循环群;然后你根据数论里的欧拉定理可以知道x^{\phi(p)}\equiv 1\pmod{p}(x\perp p),那么对于任意本原单位根\xi_a^b有\xi_a^{b^{\phi(a)}} = \xi_a^1,式子左边的东西是\xi_a^b的若干次方,所以用\xi_a^b可以生成\xi_a^1,自然就可以生成整个循环群)的若干次方就行了,那么有: f(\xi_a^b, y) = (\prod_{i = 0}^{a - 1}(1 + (\xi_a^b)^iy))^\frac{n}{a}
根据上面的说法,考虑里面的积式一定可以枚举到所有a阶单位根,所以这个积式也可以写成: f(\xi_a^b, y) = (\prod_{i = 0}^{a - 1} (1 + \xi_a^iy))^\frac{n}{a} 这么一来,我们发现对于任意a阶本原单位根\xi_a^b,对答案的贡献都是一样的,而我们知道a阶本原单位根有\phi(a)个。只要我们对所有n的约数求出其所有本原单位根的贡献的和,那么这题就做完了。
那么我们考虑,如果我们知道了a,那么怎么快速求一个本原单位根的贡献呢?
考虑那个多项式(里面的积式),首先很容易发现其0次项为1。然后我们从零点入手……
然后我们发现这个多项式几乎没法求零点……那么我们做一步小转换吧: \prod_{i = 0}^{a - 1}\xi_a^i(\xi_a^{a - i} + y)
然后我们发现\xi_a^{a - i}就枚举了所有单位根,所以零点集合就是所有单位根相反数的集合。
如果a为偶数,那么把所有单位根取相反数之后得到的集合其实和原集合事一样的……这个大致可以理解为所有单位根构成的图形关于原点中心对称。而我们知道x^a - 1 = 0的解就是全体a阶单位根,因此答案多项式和x^a - 1只有常数项的不同,而取反之后得到了1 - x^a,其零点、常数项都符合我们的要求。
如果a为奇数,那么考虑x^a,往里面带一个单位根的相反数的话,因为a为奇数所以会得到-1,所以该多项式的零点就是x^a + 1 = 0的全体解。而左边多项式的常数项也符合我们的要求,因此此时多项式为1 + x^a。
综上可得: \prod_{i = 0}^{a - 1}(1 + \xi_a^iy) = 1 - (-y)^a 而最后的答案多项式为: \frac{1}{n}\sum_{d | n}\phi(d)(1 - (-y)^d)^\frac{n}{d} 这个东西的y^k项的系数就是答案了……
Code
1 |
|