zoukankan      html  css  js  c++  java
  • UVa 10294 (Pólya计数) Arif in Dhaka (First Love Part 2)

    Burnside定理:若一个着色方案s经过置换f后不变,称s为f的不动点,将置换f的不动点的数目记作C(f)。等价类的数目等于所有C(f)的平均值。

    一个项链,一个手镯,区别在于一个能翻转一个不能,用t种颜色染n颗珠子,求等价类的个数。

    旋转置换群一共有n个置换,分别对应将项链整体逆时针旋转0个、1个、2个...珠子的置换。

    对于第i个置换,第0个、i个、2i...个珠子构成一个循环,共有gcd(n, i)个循环,每个循环中有n / gcd(n, i)个珠子。

    所以n个置换,每个置换的不动点有tgcd(i, n)个。

    对于翻转的置换群根据n的奇偶分两种情况:

    • n为奇数,对称轴有n条,每条都穿过一个珠子,每个置换有(n+1)/2个循环,其中包括(n-1)/2个长度为2的循环和一个长度为1的循环(就是穿过的那个珠子)。所以不动点的总数为nt(n+1)/2
    • n为偶数,有n/2条穿过珠子的对称轴,每个对称轴穿过两个珠子。共有n/2+1个循环,其中包括n/2-1个长度为2的循环 和 2个长度为1的循环;还有n/2条不穿过珠子的对称轴,共有n/2个长度为2的循环。

    另 a = sum{ tgcd(m, i) | 0 ≤ i ≤ n-1 }

    如果n为奇数,b = nt(n+1)/2

    如果n为偶数,b = n/2 * (t(n/2+1) + tn/2)

    则所求答案分别为 a/n 和 (a+b)/(2n)

     1 #include <cstdio>
     2 typedef long long LL;
     3 
     4 int gcd(int a, int b)
     5 { return b == 0 ? a : gcd(b, a%b); }
     6 
     7 const int maxn = 55;
     8 LL p[maxn];
     9 
    10 int main()
    11 {
    12     //freopen("in.txt", "r", stdin);
    13 
    14     p[0] = 1;
    15     int n, t;
    16     while(scanf("%d%d", &n, &t) == 2)
    17     {
    18         for(int i = 1; i <= n; i++) p[i] = p[i-1] * t;
    19         LL a = 0, b = 0;
    20         for(int i = 0; i < n; i++) a += p[gcd(n, i)];
    21         if(n & 1) b = n * p[(n+1)/2];
    22         else b = n/2 * (p[n/2+1] + p[n/2]);
    23         printf("%lld %lld
    ", a/n, (a+b)/n/2);
    24     }
    25 
    26     return 0;
    27 }
    代码君
  • 相关阅读:
    产品化软件开发与项目化软件开发的对比
    4.ThinkPHP 3.1.2 输出和模型使用
    ThinkPHP 3.1.2 输出和模型使用1
    事务管理配置与@Transactional注解使用
    logstash 区分多个文件index端配置
    logstash 读取多个系统相同文件shipper端
    centos 6.5安装git
    如何查看PHP的配置信息
    MVC模式和URL访问
    1.环境搭建
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4331268.html
Copyright © 2011-2022 走看看