polya的精髓就在与对循环节的寻找,其中常遇到的问题就是项链染色类问题。

当项链旋转时有n种置换,循环节的个数分别是gcd(n, i);

当项链翻转时有n种置换,其中当项链珠子数位奇数时,循环节的个数是n/2+1

当项链珠子数是偶数个时,当翻转线穿过珠子时,循环节个数为n/2+1,否则为n/2;

1.poj 1286:

题目大意:用三种颜色对珠子数不超过24的项链染色,问有多少种染色情况。

这道题是最基本的polya定理考察,只要带入公式即可

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. using namespace std;
  5. const long long maxa = ;
  6. long long edge[maxa];
  7. void rotate(long long n, long long ii){
  8. for(long long i = ; i < n; i++){
  9. edge[(i+ii)%n] = i;
  10. }
  11. }
  12. void turn(long long n, long long ii){
  13. for(long long i = n-, j= ; i >= ; i--, j++){
  14. edge[(j+ ii)%n] = i;
  15. }
  16. }
  17. long long vis[maxa];
  18. void dfs(long long i){
  19. if(vis[i] == )return ;
  20. vis[i] = ;
  21. dfs(edge[i]);
  22. }
  23. int main(){
  24. int n, m;
  25. while(scanf("%d%d", &m, &n), n+m){
  26. if(n == ){
  27. printf("0\n");
  28. continue;
  29. }
  30. long long ans = ;
  31. for(long long i = ; i < n; i++){
  32. rotate(n, i);
  33. long long o = ;
  34. memset(vis, , sizeof(vis));
  35. for(long long k = ;k < n; k++){
  36. if(vis[k]==){
  37. o ++;
  38. dfs(k);
  39. }
  40. }
  41. long long sum = ;
  42. for(long long k = ;k < o; k++){
  43. sum *= m;
  44. }
  45. ans += sum;
  46. }
  47. for(long long i = ; i < n; i++){
  48. turn(n, i);
  49. long long o = ;
  50. memset(vis, , sizeof(vis));
  51. for(long long k = ;k < n; k++){
  52. if(vis[k]==){
  53. o ++;
  54. dfs(k);
  55. }
  56. }
  57. long long sum = ;
  58. for(long long k = ;k < o; k++){
  59. sum *= m;
  60. }
  61. ans += sum;
  62. }
  63. cout<<ans/n/<<endl;
  64. }
  65. }

2.poj 2409

题目大意,用c种颜色染n个珠子组成的项链,也是最基本的polya定理考察

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. using namespace std;
  5. const long long maxa = ;
  6. long long edge[maxa];
  7. void rotate(long long n, long long ii){
  8. for(long long i = ; i < n; i++){
  9. edge[(i+ii)%n] = i;
  10. }
  11. }
  12. void turn(long long n, long long ii){
  13. for(long long i = n-, j= ; i >= ; i--, j++){
  14. edge[(j+ ii)%n] = i;
  15. }
  16. }
  17. long long vis[maxa];
  18. void dfs(long long i){
  19. if(vis[i] == )return ;
  20. vis[i] = ;
  21. dfs(edge[i]);
  22. }
  23. int main(){
  24. int n, m;
  25. while(scanf("%d%d", &m, &n), n+m){
  26. if(n == ){
  27. printf("0\n");
  28. continue;
  29. }
  30. long long ans = ;
  31. for(long long i = ; i < n; i++){
  32. rotate(n, i);
  33. long long o = ;
  34. memset(vis, , sizeof(vis));
  35. for(long long k = ;k < n; k++){
  36. if(vis[k]==){
  37. o ++;
  38. dfs(k);
  39. }
  40. }
  41. long long sum = ;
  42. for(long long k = ;k < o; k++){
  43. sum *= m;
  44. }
  45. ans += sum;
  46. }
  47. for(long long i = ; i < n; i++){
  48. turn(n, i);
  49. long long o = ;
  50. memset(vis, , sizeof(vis));
  51. for(long long k = ;k < n; k++){
  52. if(vis[k]==){
  53. o ++;
  54. dfs(k);
  55. }
  56. }
  57. long long sum = ;
  58. for(long long k = ;k < o; k++){
  59. sum *= m;
  60. }
  61. ans += sum;
  62. }
  63. cout<<ans/n/<<endl;
  64. }
  65. }

3.hdu 1812

题目大意,用c种颜色对n*n的棋盘染色,有多少种方法

其实这道题就是可以看成一些(n+1)/2串项链,有八种置换,但是最坑的是大数怎么写都超时....万进制优化也超时.....打表还不让大那么大,java是很好的解决方法...谁爱写谁写....反正我不写啦啦啦啦

4.poj 2154

题目大意,用n种颜色染长度是n的项链,结果mod p n<=10^9,p<= 30000,这里的项链只考虑旋转。

常规解法是这样sum(n^gcd(n,i))%q,但是数据太大了不允许,我们知道的是n的因子数是可以通过搜索求出来的,那么如果gcd(n,i) == m,则i的数量显然是euler(i),需要注意的是最后除n的时候,n和p不一定互质所以需要在之前做处理,也就是将公式变成了sum(n^gcd(n,i)-1)%q,需要注意的是开long long会超时,所以在要用int,有些部分需要用同余模定理优化。

  1. #include<iostream>
  2. #include<string.h>
  3. #include<cmath>
  4. #include<stdio.h>
  5. using namespace std;
  6. const int maxa = ;
  7. int app[maxa][];
  8. int o;
  9. int ans;
  10. int n, q;
  11. int m;
  12. int euler(int n){ //返回euler(n)
  13. //if(n == 1)return 0;
  14. int res=n,a=n;
  15. for(int i=;i*i<=a;i++){
  16. if(a%i==){
  17. res=res/i*(i-);//先进行除法是为了防止中间数据的溢出
  18. while(a%i==) a/=i;
  19. }
  20. }
  21. if(a>) res=res/a*(a-);
  22. return res;
  23. }
  24. int kuick(int a, int b){
  25. int aa = ;
  26. if(b == )return ;
  27. aa = kuick(a, b/);
  28. aa *= aa;
  29. aa%= q;
  30. if(b &) aa*= a;
  31. aa %= q;
  32. return aa;
  33. }
  34. void dfs(int ii, int nn){//cout<<"*"<<ii<<" "<<o<<" "<<nn<<endl;
  35. if(ii == o){
  36. int aa = euler(n/nn) % q;
  37. ans += aa * kuick(n%q, nn-);
  38. ans %= q;
  39. return;
  40. }
  41. dfs(ii+, nn);
  42. int ss = ;
  43. for(int i = ; i < app[ii][]; i++){
  44. ss *= app[ii][];
  45. dfs(ii+, ss*nn);
  46. }
  47. }
  48. int main(){
  49. cin>>m;
  50. while(m--){
  51. cin>>n>>q;
  52. int N = n;
  53. ans = ;
  54. int sq = sqrt(n);
  55. o = ;
  56. for(int i = ;i <= sq; i++){
  57. if(n % i == ){
  58. app[o][] = i;
  59. app[o][] = ;
  60. while(n %i ==){
  61. app[o][]++;
  62. n /= i;
  63. }
  64. o++;
  65. }
  66. }
  67. //printf("*");
  68. if(n != ){
  69. app[o][] = n;
  70. app[o++][] = ;
  71. }
  72. n = N;
  73. dfs(, );
  74. cout<<ans<<endl;
  75. }
  76. }

polya定理小结的更多相关文章

  1. 【转】Polya定理

    转自:http://endlesscount.blog.163.com/blog/static/82119787201221324524202/ Polya定理 首先记Sn为有前n个正整数组成的集合, ...

  2. 【群论】polya定理

    对Polya定理的个人认识     我们先来看一道经典题目:     He's Circles(SGU 294)         有一个长度为N的环,上面写着“X”和“E”,问本质不同的环有多少个(不 ...

  3. [wikioi2926][AHOI2002]黑白瓷砖(Polya定理)

    小可可在课余的时候受美术老师的委派从事一项漆绘瓷砖的任务.首先把n(n+1)/2块正六边形瓷砖拼成三角形的形状,右图给出了n=3时拼成的“瓷砖三角形”.然后把每一块瓷砖漆成纯白色或者纯黑色,而且每块瓷 ...

  4. HDU 3923 Invoker(polya定理+逆元)

    Invoker Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 122768/62768 K (Java/Others)Total Su ...

  5. Polya定理

    http://www.cnblogs.com/wenruo/p/5304698.html 先看 Polya定理,Burnside引理回忆一下基础知识.总结的很棒. 一个置换就是集合到自身的一个双射,置 ...

  6. POJ 2409 Let it Bead(Polya定理)

    点我看题目 题意 :给你c种颜色的n个珠子,问你可以组成多少种形式. 思路 :polya定理的应用,与1286差不多一样,代码一改就可以交....POJ 1286题解 #include <std ...

  7. POJ 1286 Necklace of Beads(Polya定理)

    点我看题目 题意 :给你3个颜色的n个珠子,能组成多少不同形式的项链. 思路 :这个题分类就是polya定理,这个定理看起来真的是很麻烦啊T_T.......看了有个人写的不错: Polya定理: ( ...

  8. 百练_2409 Let it Bead(Polya定理)

    描述 "Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. As you ca ...

  9. HDU 4633 Who's Aunt Zhang (Polya定理+快速幂)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4633 典型的Polya定理: 思路:根据Burnside引理,等价类个数等于所有的置换群中的不动点的个 ...

随机推荐

  1. 博客迁移至http://www.maxzhang.com,欢迎访问!

    博客迁移至http://www.maxzhang.com,欢迎访问!

  2. phpcms 2008和discuz X3.1实现同步登陆退出论坛(已实现)

    网络上文章很多,按步骤配置好了之后phpcms可以同步登录dz,但是dz登录后状态却无法同步到phpcms,网络上找了很多资料都大同小异,头大.只能自己调试了,废话不多说了.       以下网络上抄 ...

  3. Jquery 学习插件第一天

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...

  4. Solr Dataimport配置

    参考资料: https://cwiki.apache.org/confluence/display/solr/Uploading+Structured+Data+Store+Data+with+the ...

  5. restful-----------------------------接口设计方式(一种风格)

    http动词: GET(SELECT):从服务器取出资源(一项或者多项) POST(CREATE):在服务器创建一个资源 PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)完整更新 ...

  6. 解压Taobao手机客户端发现的东西

    今天解压了Taobao手机客户端发现了几个.so文件, 其中有两个挺感兴趣的,查了一下,以后去研究下. libBSPatch.so 是用于支持增量更新功能的库文件. libwebp.so  好像是We ...

  7. swipejs

    http://swipejs.com/ http://www.scoop.it/t/javascript-for-mobile http://www.open-open.com/news/view/c ...

  8. php 读取 word

    ---恢复内容开始--- 首先安装com扩展: php.ini php.ini 确保有此语句 [PHP_COM_DOTNET] extension=php_com_dotnet.dll   php.i ...

  9. android TextView 添加下划线

    android Textview加下划线 由于新做的一个项目要求有字体带下划线效果,当时看了下其实可以通过图片伪造出那种视觉效果.但是为了体现点技术含量,于是我想用Textview带下划线的效果.方法 ...

  10. 设置mysql数据库的密码

    mysql>set password=password("......");