Polya计数法总结 POJ24092154SGU282
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相关推荐
- python科学计数法转换_对比Python学习Go 基本数据结构
公众号文章不方便更新,可关注底部「阅读原文」博客,文章随时更新. 本篇是「对比 Python 学习 Go」[1] 系列的第三篇,本篇文章我们来看下 Go 的基本数据结构.Go 的环境搭建,可参考之前的 ...
- 【PAT (Basic Level) 】1024 科学计数法 (20 分)
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [±][1-9].[0-9]+E[±][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部 ...
- 把浮点型数值用科学计数法输出
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<strin ...
- R语言禁止数值表示为科学计数法实战(Turn Off Scientific Notation ):全局设置或者单变量设置
R语言禁止数值表示为科学计数法实战(Turn Off Scientific Notation ):全局设置或者单变量设置 目录
- numpy使用np.set_printoptions函数抑制numpy数组输出结果使用科学计数法进行显示(suppressing scientific notation in numpy array)
numpy使用np.set_printoptions函数抑制numpy数组输出结果使用科学计数法进行显示(suppressing scientific notation in numpy array) ...
- Python使用pandas设置数据列中float数据类型的有效小数位数、抑制科学计数法
Python使用pandas设置数据列中float数据类型的有效小数位数.抑制科学计数法 目录
- R语言ggplot2可视化包抑制数据轴使用科学计数法实战
R语言ggplot2可视化包抑制数据轴使用科学计数法实战 目录 R语言ggplot2可视化包抑制数据轴使用科学计数法实战
- 1024. 科学计数法 (20)
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位 ...
- Js 对小数的处理(科学计数法 , 显示精度)
对数字进行格式化输出,是非常有意义的一件事情,例如许多时候,我们希望一个数字能够输出为指定格式的字符串,拿25.9878来说,我们可能会希望它能保留两位小数来说出,即结果为25.99,或者对于0.34 ...
最新文章
- C++ 对引用的深入理解
- Linux容器的发展历史及其未来趋势
- ES6中的rest参数
- axios请求五种方法
- OpenGL GLSL Shader Subroutines函数的实例
- html相对定位向上偏移,使用CSS的相对定位和偏移量
- 22504!Windows 11 新预览版发布
- 数据库建表需要外键约束?
- win10mongodb链接_Windows 10 安装 Mongodb
- SQLServer 2000中,存储过程和用户自定义函数具体的区别??
- LuaForUnity6:Lua模块
- 3.7 钱包、帐户、token、智能合约、action、权限、权重和阀值之间关系
- linux cpu驱动程序,Linux kernel-CPU 调频
- Java基础之Java 修饰符
- 广数系统加工中心编程_图解数控铣及加工中心加工工艺与编程——(FANUC系统)/(SIEMENS系统)...
- 软件工程导论---软件测试(集成测试、单元测试、验收测试、系统测试)
- 汇佳学校|牛畅:帕森斯摄影专业,累计130万奖学金,我用照片沉淀时间
- 2021-4-8 【链表】【】
- Hantek6022BE 虚拟示波器 使用心得
- SecureCRT鼠标快速复制粘贴