Polya计数法原理可以看符文杰的集训队论文<<Polya原理及其应用>>、题目可以看陈瑜希的论文<<Polya计数法的应用>>

解题三步骤:

1、确定置换群(注意考虑周全)

2、计算每个置换下的循环节数目

3、带入公式

有时候置换数目太多,而许多置换具有相同的循环节数目,可以统一起来考虑,进行优化。

下面是三道例题,难度递增,第一题是裸题,后面两题都用到了上面说的优化。

1、POJ2409

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,m;
ll GCD(ll a,ll b)
{if(b==0)return a;return GCD(b,a%b);
}
ll Pow(ll a,ll b)
{ll ret=1,c=a;while(b){if(b&1)ret*=c;c*=c;b>>=1;}return ret;
}
int main()
{ll i,j,ans;while(cin>>m>>n){if(n==0&&m==0)break;ans=0;for(i=0;i<n;++i)ans+=Pow(m,GCD(n,i));if(n&1)ans+=n*Pow(m,n/2+1);else{ans+=n/2*Pow(m,n/2+1);ans+=n/2*Pow(m,n/2);}cout<<ans/(2*n)<<endl;}return 0;
}

2、POJ2154

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
//typedef long long LL;
int Prime[36000]; //一个数n大于sqrt(n)的质因子最多只有一个
bool Flag[36000];
int tot;
void Get_Prime_Table()
{tot=0;memset(Flag,false,sizeof(Flag));int i,j;for(i=2;i<36000;i++){if(!Flag[i]){for(j=2*i;j<36000;j+=i)Flag[j]=true;}}for(i=2;i<36000;++i)if(!Flag[i])Prime[tot++]=i;
//    cout<<tot<<endl;
}
int Eular(int n,int p)
{int ret=n,i;for(i=0;i<tot&&Prime[i]*Prime[i]<=n;++i){if(n%Prime[i]==0){ret-=ret/Prime[i];while(n%Prime[i]==0)n/=Prime[i];}}if(n!=1)ret-=ret/n;return ret%p;
}
int Pow(int a,int b,int p)
{int ret=1,c=a%p;while(b){if(b&1)(ret*=c)%=p;(c*=c)%=p;b>>=1;}return ret;
}
int main()
{int X;int N,P,i,ans;scanf("%d",&X);Get_Prime_Table();while(X--){scanf("%d %d",&N,&P);ans=0;for(i=1;i*i<=N;++i){if(i*i==N){
//                cout<<i<<endl;cout<<Eular(i,P)<<endl;
//                cout<<"................."<<endl;  (ans+=Eular(i,P)*Pow(N,i-1,P))%=P;}else if(N%i==0){
//                cout<<i<<endl;
//                cout<<Eular(i,P)<<endl;
//                cout<<Eular(N/i,P)<<endl;
//                cout<<"....................."<<endl;(ans+=Eular(i,P)*Pow(N,N/i-1,P)+Eular(N/i,P)*Pow(N,i-1,P))%=P;}}printf("%d\n",ans);}return 0;
}

3、SGU282

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
LL Mod;
LL L[55],Tot,K[55],N,M,Num,Div;
LL GCD(LL a,LL b)
{if(b==0)return a;return GCD(b,a%b);
}
LL Pow(LL a,LL b)
{LL c=a%Mod,ret=1;while(b){if(b&1)(ret*=c)%=Mod;(c*=c)%=Mod;b>>=1;}return ret;
}
void Init()
{Tot=0,Num=1;memset(K,0,sizeof(K));LL i;for(i=2;i<=N;++i){(Num*=i)%=Mod;}Div=Pow(Num,Mod-2);
}
LL Fact(LL a)
{LL i,ret=1;for(i=2;i<=a;++i){(ret*=i)%=Mod;}return ret;
}
LL DFS_Polya(LL remain,LL limit)
{if(remain==0){LL i,j,t1=1,t2=0;memset(K,0,sizeof(K));for(i=0;i<Tot;++i){(t1*=L[i])%=Mod;t2+=L[i]/2;K[L[i]]++;}for(i=1;i<=N;++i){(t1*=Fact(K[i]))%=Mod;}for(i=0;i<Tot;++i){for(j=i+1;j<Tot;++j){t2+=GCD(L[i],L[j]);}}return (((Num*Pow(t1,Mod-2))%Mod)*Pow(M,t2))%Mod;}else{LL i,j,ret=0;for(i=1;i<=limit&&i<=remain;++i){L[Tot++]=i;(ret+=DFS_Polya(remain-i,i))%=Mod;Tot--;}return ret;}
}
int main()
{scanf("%I64d %I64d %I64d",&N,&M,&Mod);Init();printf("%I64d\n",(DFS_Polya(N,N)*Div)%Mod);return 0;
}

Polya计数法总结 POJ24092154SGU282相关推荐

  1. python科学计数法转换_对比Python学习Go 基本数据结构

    公众号文章不方便更新,可关注底部「阅读原文」博客,文章随时更新. 本篇是「对比 Python 学习 Go」[1] 系列的第三篇,本篇文章我们来看下 Go 的基本数据结构.Go 的环境搭建,可参考之前的 ...

  2. 【PAT (Basic Level) 】1024 科学计数法 (20 分)

    科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [±][1-9].[0-9]+E[±][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部 ...

  3. 把浮点型数值用科学计数法输出

    #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<strin ...

  4. R语言禁止数值表示为科学计数法实战(Turn Off Scientific Notation ):全局设置或者单变量设置

    R语言禁止数值表示为科学计数法实战(Turn Off Scientific Notation ):全局设置或者单变量设置 目录

  5. numpy使用np.set_printoptions函数抑制numpy数组输出结果使用科学计数法进行显示(suppressing scientific notation in numpy array)

    numpy使用np.set_printoptions函数抑制numpy数组输出结果使用科学计数法进行显示(suppressing scientific notation in numpy array) ...

  6. Python使用pandas设置数据列中float数据类型的有效小数位数、抑制科学计数法

    Python使用pandas设置数据列中float数据类型的有效小数位数.抑制科学计数法 目录

  7. R语言ggplot2可视化包抑制数据轴使用科学计数法实战

    R语言ggplot2可视化包抑制数据轴使用科学计数法实战 目录 R语言ggplot2可视化包抑制数据轴使用科学计数法实战

  8. 1024. 科学计数法 (20)

    科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位 ...

  9. Js 对小数的处理(科学计数法 , 显示精度)

    对数字进行格式化输出,是非常有意义的一件事情,例如许多时候,我们希望一个数字能够输出为指定格式的字符串,拿25.9878来说,我们可能会希望它能保留两位小数来说出,即结果为25.99,或者对于0.34 ...

最新文章

  1. C++ 对引用的深入理解
  2. Linux容器的发展历史及其未来趋势
  3. ES6中的rest参数
  4. axios请求五种方法
  5. OpenGL GLSL Shader Subroutines函数的实例
  6. html相对定位向上偏移,使用CSS的相对定位和偏移量
  7. 22504!Windows 11 新预览版发布
  8. 数据库建表需要外键约束?
  9. win10mongodb链接_Windows 10 安装 Mongodb
  10. SQLServer 2000中,存储过程和用户自定义函数具体的区别??
  11. LuaForUnity6:Lua模块
  12. 3.7 钱包、帐户、token、智能合约、action、权限、权重和阀值之间关系
  13. linux cpu驱动程序,Linux kernel-CPU 调频
  14. Java基础之Java 修饰符
  15. 广数系统加工中心编程_图解数控铣及加工中心加工工艺与编程——(FANUC系统)/(SIEMENS系统)...
  16. 软件工程导论---软件测试(集成测试、单元测试、验收测试、系统测试)
  17. 汇佳学校|牛畅:帕森斯摄影专业,累计130万奖学金,我用照片沉淀时间
  18. 2021-4-8 【链表】【】
  19. Hantek6022BE 虚拟示波器 使用心得
  20. SecureCRT鼠标快速复制粘贴

热门文章

  1. 10.数据类型-json/jsonb类型
  2. 新媒体学院运营模式提要-V1
  3. 数字滤波器在语音信号处理中的应用及其设计方法
  4. 案例:个税计算器(2019)
  5. 智慧党务管理源码,竞赛答题+阅读学习一套系统全搞定
  6. panoptic polarnet 笔记
  7. 风清扬自学日记(1)----自动化xxqg的部署
  8. android驱动备份软件下载,driver软件下载
  9. 接触电阻导通电阻四线毫欧电阻信号隔离转换器0-500mΩ 0-100mΩ转4-20ma
  10. 唯品会三年,我只做了5件事,如今跳槽天猫拿下offer(Java岗)