zoukankan      html  css  js  c++  java
  • 【uva 10294】 Arif in Dhaka (First Love Part 2) (置换,burnside引理|polya定理)

    题目来源:UVa 10294 Arif in Dhaka (First Love Part 2)

    题意:n颗珠子t种颜色 求有多少种项链和手镯 项链不可以翻转 手镯可以翻转

      【分析】

      要开始学置换了。

      置换是什么呢? 

    置换的广义概念在不同语境下有不同的形式定义:

    集合论中,一个集合的置换是从该集合映至自身的双射;在有限集的情况,便与上述定义一致。
    组合数学中,置换一词的传统意义是一个有序序列,其中元素不重复,但可能有阙漏。例如1,2,4,3可以称为1,2,3,4,5,6的一个置换,但是其中不含5,6。此时通常会标明为“从n个对象取r个对象的置换”。
     
     
      置换的乘法:
      f={1,3,2} g={2,1,3} f*g={2,3,1}
      计算过程是 1->1->2, 2->3->3 , 3->2->1 。
      
      置换的循环移位  (1 4 3)表示1->4, 4->3, 3->1。
      比如 (1 2 3 4 5)
                (3 5 1 4 2) =(1 3)(2 5)(4)
      循环节为3.
     
      等价类计数问题
      题目定义一种等价关系,满足等价关系的元素被看成是同一类,只统计一次。等价关系满足自反性、对称性、传递性。
       
      burnside引理
      对于一个置换f,若一个着色方案s经过置换后不变,称s为f的不动点。(即循环里面只有一个元素)
      将f的不动点数目记为C(f),则可以证明等价类数目为所有C(f)的平均值。
     
      这题用到burnside引理或polya定理。(polya定理可以用burnside引理证明)
     
      本题:
      旋转:
        如果逆时针旋转i颗珠子的间距,那么珠子0,i,2*i...构成一个循环。这个循环有n/gcd(i,n)个元素,根据对称性,所有循环长度均相同,因此一共有gcd(i,n)个循环。这些置换的不动点总数为a=sigma(t^gcd(i,n))。
     
      翻转:
        分两种情况讨论。当n为奇数时,对称轴有n条,。。。。不动点总数为$n*t$^$dfrac{n+1}{2}$
        当n为偶数是时,有两种对称轴,一共n条,。。。。不动点总数为$dfrac{n}{2}*(t$^$(dfrac{n}{2}+1)+t$^$dfrac{n}{2})$
     
      加起来求均值即可。
     
     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<cmath>
     7 using namespace std;
     8 #define Maxn 60
     9 #define LL long long
    10 
    11 LL pw[110];
    12 
    13 int gcd(int a,int b)
    14 {
    15     if(b==0) return a;
    16     return gcd(b,a%b);
    17 }
    18 
    19 int main()
    20 {
    21     int n,t;
    22     while(scanf("%d%d",&n,&t)!=EOF)
    23     {
    24         pw[0]=1;
    25         for(int i=1;i<=n;i++) pw[i]=pw[i-1]*t;
    26         LL a=0;
    27         for(int i=0;i<n;i++) a+=pw[gcd(i,n)];
    28         LL b=0;
    29         if(n%2==1) b=n*pw[(n+1)/2];
    30         else b=n/2*(pw[n/2+1]+pw[n/2]);
    31         printf("%lld %lld
    ",a/n,(a+b)/2/n);
    32     }
    33     return 0;
    34 }
    View Code

      其实觉得这题的数据范围过不了啊,不是10^50了么????

      为什么大家都这样打??

    2017-01-11 11:18:14

  • 相关阅读:
    【PHP】算法: 获取满足给定值的最优组合
    @程序员,你还记得当年高考时的样子吗?
    教妹学 Java:难以驾驭的多线程
    二十九岁,刚读完了财富启蒙读物《小狗钱钱》
    蓦然回首,Java 已经 24 岁了!
    @程序员,你需要点金融常识
    教妹学 Java:大有可为的集合
    @程序员,你需要点财商
    教妹学 Java:晦涩难懂的泛型
    大量阅读,并不等同于“走马观花”
  • 原文地址:https://www.cnblogs.com/Konjakmoyu/p/6272826.html
Copyright © 2011-2022 走看看