Problem. A

题意简述:

求从(1,cdots,n)中选(m)个不同的数,满足选出来的数的和(equiv kpmod n)的方案数。答案对(998244353)取模。

数据范围:

(0le k<n<998244353,mle n)

解法:

考虑答案的生成函数:
(ans=sumlimits_{tequiv kpmod n}[x^t][y^m]prodlimits_{i=0}^{n-1}(1+x^iy))
用循环卷积的方式表示就是:
(ans=[x^k][y^m]prodlimits_{i=0}^{n-1}(1+x^iy)pmod{x^n-1})
然后单位根反演,得到:
(ans=frac1n[y^m]sumlimits_{j=0}^{n-1}omega_n^{-jk}prodlimits_{i=0}^{n-1}(1+omega_n^{ij}y))
注意到(forall (n,j)=d,prodlimits_{i=0}^{n-1}(1+omega_n^{ij}y))都一样,因此我们可以考虑枚举((n,j)),得到:
(ans=frac1n[y^m]sumlimits_{d|n}(prodlimits_{i=0}^{n-1}(1+omega_n^{id}y))(sumlimits_{i=0}^{n-1}[(i,n)=d]omega_n^{-ik}))
先考虑如何计算(prodlimits_{i=0}^{n-1}(1+omega_n^{id}y)),利用(y^n-1=prodlimits_{i=0}^{n-1}(y-omega_n^i)),得到:
(prodlimits_{i=0}^{n-1}(1+omega_n^{id}y)=(prodlimits_{i=0}^{frac nd-1}(1+omega_{frac nd}^iy))^d=(1-(-y)^{frac nd})^d=sumlimits_{i=0}^d(-1)^{frac{ni}d+i}{dchoose i}y^{frac {ni}d})
再考虑如何计算(sumlimits_{i=0}^{n-1}[(i,n)=d]omega_n^{-ik}),利用(sumlimits_{d|n}mu(d)=[n=1])(frac1nsumlimits_{i=0}^{n-1}omega_n^{ik}=[n|k]),得到:
(sumlimits_{i=0}^{n-1}[(i,n)=d]omega_n^{-ik}=sumlimits_{i=1}^{frac nd}[(i,frac nd)=1]omega_{frac nd}^{-ik}=sumlimits_{g|frac nd}mu(g)sumlimits_{i=0}^{frac n{dg}-1}omega_{frac n{dg}}^{ik}=sumlimits_{g|frac nd}mu(g)[frac n{dg}|k]frac n{dg})
总结起来就是:
(ans=frac1n[y^m]sumlimits_{d|n}(sumlimits_{i=0}^d(-1)^{frac{ni}d+i}{dchoose i}y^{frac {ni}d})(sumlimits_{g|frac nd}mu(g)[frac n{dg}|k]frac n{dg}))
暴力计算即可,组合数可以分段打表/快速阶乘算法。

原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/12270274.html