博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2154:Color【polya计数,Euler函数】
阅读量:5058 次
发布时间:2019-06-12

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

poj 2154:Color

大意:n种颜色的珠子可组成多少种长度为n的项链?

这题和2409 类似,不同之处在于,只考虑旋转,不考虑翻转;
因此相对前面两个题目应该说是更简单,但一看数据范围,
就不是这么回事了,2409完全可以直接循环处理,
但这题目n最大达100000000,显然会TLE,故需寻求更佳的解决方案。
用欧拉函数进行优化:

旋转:顺时针旋转i格的置换中,循环的个数为gcd(i,n),每个循环的长度L为n/gcd(i,n)。

如果枚举旋转的格数i,复杂度显然较高。有没有好方法呢?可以不枚举i,反过来枚举L。
由于L|N,枚举了L,再计算有多少个i使得0<=i<=n-1并且gcd(i,n)=n/L。
不妨设a=n/L=gcd(i, n),
不妨设i=a*t则当且仅当gcd(L,t)=1时
Gcd(i,n)=gcd(a*L,a*t)=a。
因为0<=i<n,所以0<=t<n/a=L.
所以满足这个条件的t的个数为Euler(L).

#include
#include
const int N = 36000;int prime[N];int pnum;bool isp[N];int mod;void getPrim(){ int i,j; pnum = 0; memset(isp,true,sizeof(isp)); for(i=2;i
>=1; a=(a*a)%mod; } return ans;}int main(){ getPrim(); int T; scanf("%d",&T); { while(T--) { int a,l; int ans = 0; scanf("%d%d",&a,&mod); for(l=1;l*l

转载于:https://www.cnblogs.com/AndreMouche/archive/2011/02/16/1956201.html

你可能感兴趣的文章
面向对象设计
查看>>
ant 安装
查看>>
新手Python第一天(接触)
查看>>
vue路由动态加载
查看>>
【原】UIWebView加载本地pdf、doc等文件
查看>>
iOS中ARC内部原理
查看>>
【bzoj1029】[JSOI2007]建筑抢修
查看>>
synchronized
查看>>
你不得不了解的应用容器引擎---Docker
查看>>
easyui datagrid 弹出页面会出现两个上下滚动条处理办法!
查看>>
迭代器和生成器
查看>>
MYSQL分区表功能测试简析
查看>>
codevs 1080 线段树练习
查看>>
JS模块化库seajs体验
查看>>
Android内核sysfs中switch类使用实例
查看>>
POJ2288 Islands and Bridges(TSP:状压DP)
查看>>
POJ3250 Bad Hair Day(单调栈)
查看>>
[No0000195]NoSQL还是SQL?这一篇讲清楚
查看>>
IOS开发UI篇--UITableView的自定义布局==xib布局
查看>>
【深度学习】caffe 中的一些参数介绍
查看>>