这里旋转就相当于置换, 本质不同的的染色方案就相当于轨道数. 那么使用 Burnside 引理, 把轨道数转化为置换的不动点数量.
这里总共有 n 个置换, 每个置换都形如
{1i2i+13i+2⋯⋯n−i+1nn−i1⋯⋯n−1i−2ni−1}
那么第 i 个置换的每个循环的长度为 lgt=ilcm(i,n)=gcd(i,n)n, 循环的数量为 num=gcd(i,n).
所以 n 就会被分成 lgt 段由 num 个属于不同循环的点组成的区间 (是的这里没打错).
那么对这个 n 元环的染色就相当于对这个 num 元环的染色. (因为每个循环中的颜色都必须相同.)
那么我们设 g(i,j) 为给 i 元环染上 m 个黑点的合法方案数 (不考虑循环同构).
那么我们要求的就是 (这里我们默认 gcd(i,n)n∣m.)
n1i=1∑ng(gcd(i,n),n/gcd(i,n)m)
改为枚举 gcd (默认 d∣n)
n1i=1∑ng(gcd(i,n),n/gcd(i,n)m)=n1d=1∑ng(d,n/dm)i=1∑dn[gcd(dn,i)=1]=n1d=1∑ng(d,n/dm)φ(dn)
那么现在考虑怎么求 g(d,n/dm).
环不好弄, 那么我们枚举最后一段黑色连续段和第一段黑色连续段的长度之和, 断环为链. 然后因为黑点和白点的数量是固定的, 所以我们可以把黑色连续段看做把若干个黑点放在白点之间. 然后每段黑色连续段长度不超过 k 的方案可以用容斥算出来.
形式化地说, 设 h(n,c) 为将 c 个黑点放进 n 个空位中的方案. 则有
g(d,n/dm)=i=0∑k(i+1)h(d−n/dm−1,n/dm−i)
(乘上 (i+1) 是因为要算最后一段和第一段分别放了多少个黑点.)
h(n,c)=i=0∑⌊k+1c⌋(−1)i(in)(n−1c−i(k+1)+n−1)
(最后一个组合数是用 插板法 + 可重组合 计算把 c−i(k+1) 个黑点放进 n 个空位的方案.)
这样每次计算 g(d,n/dm) 的时间复杂度为 O(k⌊k+1n/dm⌋)=O(d), 所以总时间复杂度为 O(σ(n)).