题意
对$n$个珠子构成的环染$m$种颜色, 并且规定一些颜色不能相邻. 旋转后相同算是同一种方案, 求本质不同的着色方案数.$(m\le 10 , n \le 10^9)$
分析
如果没有限制我们可以用$Polya$计数来做 , 如果有限制就需要改写一下计算式子了.
当没有限制时
$$
\begin{aligned}
ans&=\frac{1}{n}\cdot \sum_{i=1}^{n}m^{gcd(n,i)}\\
&=\frac{1}{n}\cdot \sum_{d|n}\cdot m^{d}\cdot\varphi(\frac{n}{d})
\end{aligned}
$$
可以看到式子中的”$m^d$”部分为当$gcd(n,i)=d$所有保持不变的染色方案数, 我们设这一部分为一个函数$\psi(d)$
则上式变为
$$ans=\frac{1}{n}\cdot \sum_{d|n}\cdot \psi(d)\cdot\varphi(\frac{n}{d})$$
我们需要做的就是构造这个函数
我们之所以求出$gcd(n,i)$是因为一个位置在旋转$\pi/n*i$后, 它经过$\frac{n}{gcd(n,i)}$个置换之后会回到原来的位置, 那么也就相当于在一个边数为$gcd(n,i)$的多边形上的所有合法着色方案数
所以$\psi(d)$也就是相当于在一个边数为$d$的多边形上进行染色, 再加上限制后, 我们可以构造一个对颜色转移的邻接矩阵$g$, 若颜色$i$与颜色$j$可以相邻, 则矩阵的$g_{ij}=g_{ji}=1$. 我们求得矩阵$G=g^d$后, 矩阵的$G_{ii}$代表从某一位置开始, 这一位置染为颜色$i$的合法着色方案总数, 累加上所有$G_{ii}$即为$\psi(d)$
代码
1 | #include <cstdio> |