博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2154 Color (Polya计数)
阅读量:4957 次
发布时间:2019-06-12

本文共 1630 字,大约阅读时间需要 5 分钟。

  题意:给你N种颜色的珠子,个数不限,串成一个长度为N的项链,经过旋转以后,问能形成多少等价类

  分析:套用Polya定理的计数公式即可,题目中的旋转操作可以形成N个置换,假设旋转了i个珠子,那么这个置换的置换环个数为gcd(i,N),但是这里N比较大,需要枚举N的所有因子然后欧拉函数优化。这个题当时我还在想模的数不是质数,逆元怎么办,然后才发现置换群的大小是N,颜色的个数也是N,不需要逆元(笑哭),还有就是这题数据挺强的,时间上尽量多优化一些。

  代码如下:

#include
#include
#include
#include
using namespace std;#define LL long longconst int N = 1e6+6;bool isp[N];int cnt,P[78598];LL ol[N];void init(){ cnt=0; int up = 1000000; for(int i=2;i<=up;i++){ if(!isp[i]){ P[cnt++]=i; ol[i] = i-1; } for(int j=0;j
up) break; isp[tmp] = 1; if(i%P[j] == 0){ ol[tmp] = ol[i]*P[j]; break; }else { ol[tmp] = ol[i]*(P[j]-1); } } } ol[1] = 1;// cout<
<
n) break; if(n%P[i] == 0){ res = res/P[i]*(P[i]-1); } while(n%P[i] == 0) n/=P[i]; } if(n!=1) res = res/n*(n-1); return res%p;}LL Pow(LL x,int y){ LL res = 1; while(y){ if(y&1){ res=(res*x)%p; } x=(x*x)%p; y>>=1; } return res;}int read(){ int res=0; char ch; while((ch=getchar())){ if(ch>='0'&&ch<='9'){ res = ch-'0'; break; } } while((ch=getchar())){ if(ch<'0'||ch>'9') break; res *= 10; res += ch-'0'; } return res;}int main(){ init(); int T,n; T = read(); while(T--){ n = read(); p = read(); LL ans = 0; for(int i=1;i*i<=n;i++){ if(n%i == 0){ ans=(ans+(Euler(n/i)*Pow(n,i-1))%p)%p; int p2 = n/i; if(p2!=i) { ans=(ans+(Euler(n/p2)*Pow(n,p2-1))%p)%p; } } } printf("%lld\n",ans); } return 0;}

 

转载于:https://www.cnblogs.com/jifahu/p/7860391.html

你可能感兴趣的文章
wordpress自动截取文章摘要代码
查看>>
[置顶] 一名优秀的程序设计师是如何管理知识的?
查看>>
关于使用“状态模式”做工作流概要。
查看>>
谈谈:程序集加载和反射
查看>>
scanf和gets
查看>>
highcharts 图表实例
查看>>
【知识强化】第二章 线性表 2.2 线性表的顺序表示
查看>>
00_前情回顾
查看>>
fortran90简明教程
查看>>
ubuntu下如何查看用户登录及系统授权相关信息
查看>>
秋季学期学习总结
查看>>
SpringBoot 优化内嵌的Tomcat
查看>>
【LaTeX】E喵的LaTeX新手入门教程(1)准备篇
查看>>
highcharts曲线图
查看>>
extjs动态改变样式
查看>>
PL/SQL Developer 查询的数据有乱码或者where 字段名=字段值 查不出来数据
查看>>
宏定义
查看>>
ubuntu12.04 串口登录系统配置
查看>>
poj3061
查看>>
linux--多进程进行文件拷贝
查看>>