题目
$N$个珠子组成的圆环,用$M$种颜色给每个珠子涂色。有$K$个限制条件:$a_i$和$b_i$不能相邻。若两种涂色方案旋转相同,则视为相同方案。问有多少种不同的涂色方案。
数据范围
$N \leq 10^9 \quad M \leq 10 \quad K \leq \frac{M(M-1)}{2}$
做法
因为对于涂色有限则,所以不能用Polya定理,要用Burnside引理。
考虑旋转$k(0\leq k \leq N-1)$个珠子的置换$\sigma_k$。它的循环节长度为$gcd(N,k)$,故不动点的个数等价于“序列$a_1,a_2,\cdots,a_{gcd(N,k)},a_1$合法的涂色方案数”。
由于$M$很小,考虑dp。
$f[n][i][j]:=$$i$到$j$的长度为$n$的路径的条数。
转移方程为:$f[n][i][j]=\sum_kf[n-1][i][k] * f[1][k][j]$。这可以看作是矩阵乘法。
边界条件为:$f[1][i][j]$就是图的邻接表。
由于$N$很大,矩阵乘法要用快速幂优化。
所以,$\sigma_k$的不动点个数就是$\sum_i f[gcd(N,k)][i][i]$。
由于$N$很大,直接循环一遍$k$来计算答案会超时。注意到,$gcd(N,k)=d|N$,而$N$的约数$d$的个数很少,我们可以计算有多少$k$使得$gcd(N,k)=d$。设$k=md\quad 0\leq m \leq \frac{N-1}{d} < \frac{N}{d}$,则有$d=gcd(N,k)=g(N,md)=d\times gcd(\frac{N}{d},m)$,所以$gcd(\frac{N}{d},m)=1$。所以,对于某个$d$,$k$的个数=$m$的个数=$\phi(\frac{N}{d})$。
由于$d$的质因数也是$N$的质因数,所以预处理出$N$的质因数,便可在$O(log_2N)$的时间内求出$\phi(d)$。
所以,答案就是:
$$
\frac{1}{N} \sum_{d|N} \phi(\frac{N}{d})\times \sum_i f[d][i][i]
$$
复杂度为:$O(\sqrt{N}+d(N)\times (M^3log_2N+log_2N))$
代码
|
|
总结
- 垃圾POJ
- 矩阵乘法要是用
vecctor
来实现会超时,边算边求余也会超时。