【poj2409】Let it Bead Polya定理
用 c 种颜色去染 r 个点的环,如果两个环在旋转或翻转后是相同的,则称这两个环是同构的。求不同构的环的个数。 r·c≤32 。
题解
Polya定理
Burnside引理:一个置换群的等价类数目等于这个置换群中所有置换的不动点数目的平均值;
Polya定理:设有限群G有 m 个置换,第 i 个置换有 ai 个循环,现在要将所有的点染成 c 种颜色,那么染色后群G的等价类数目为:L=ca1+ca2+…+camm 。
推导过程:显然对于第 i 个置换来说,不动点要求所有循环的颜色相同,每个循环有 c 种颜色选择,所以该置换的不动点数目为 cai 。
那么考虑每种置换的循环数目:
如果没有翻转操作:设旋转 k 个位置,考虑一个循环的大小 x ,实际上就是 kx\mod r=0 的最小正整数解(转了 x 次后回到原处)。
显然 x=\frac{\text{lcm}(k,r)}{k}=\frac{r}{\gcd(k,r)} ,因此循环个数为 \frac{r}{\frac{r}{\gcd(k,r)}}=\gcd(k,r) ,方案数为 c^{\gcd(k,r)} ;
如果有翻转操作:对于任意的 旋转-翻转-旋转 操作都等同于一次翻转操作。因此只需要统计所有本质不同的翻转操作的答案。
当 r 为奇数时,对称轴为 某点-对边中点 ,显然这样置换有 r 种,每个置换有 \frac{r+1}{2} 个循环。因此答案为 rc^{\frac{r+1}{2}} ;
当 r 为偶数时,对称轴为 某点-对点 时,置换有 \frac r2 种,每个置换有 \frac r2+1 个循环;对称轴为 某边-对边中点 时,置换有 \frac r2 种,每种置换有 \frac r2 个循环。因此答案为 \frac r2(c^{\frac r2}+c^{\frac r2+1}) 。
把这两部分加起来即为答案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include <cstdio> typedef long long ll; int gcd( int a , int b) { return b ? gcd(b , a % b) : a; } int main() { int n , m , i , d; ll ans , t; while (~ scanf ( "%d%d" , &m , &n) && (n || m)) { ans = 0; for (i = 1 ; i <= n ; i ++ ) { t = 1 , d = gcd(i , n); while (d -- ) t *= m; ans += t; } if (n & 1) { t = n; for (i = 1 ; i <= n / 2 + 1 ; i ++ ) t *= m; ans += t; } else { t = n / 2; for (i = 1 ; i <= n / 2 ; i ++ ) t *= m; ans += t; t = n / 2; for (i = 1 ; i <= n / 2 + 1 ; i ++ ) t *= m; ans += t; } printf ( "%lld\n" , ans / 2 / n); } return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步