poj2409 & 2154 polya计数+欧拉函数优化
这两个题都是项链珠子的染色问题
也是polya定理的最基本和最经典的应用之一
题目大意: 用m种颜色染n个珠子构成的项链,问最终形成的等价类有多少种
项链是一个环。通过旋转或者镜像对称都可以得到置换
旋转可以旋转 i=[1,n]次。。画图可以看出循环节有gcd(n,i)个
镜像对称的置换画个图也是很容易找的
然后通过polya定理就可以容易的求出等价类的种数了
2409就是这样一个裸题,以下为ac代码
#include <iostream>
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<ctype.h>
using namespace std;
#define MAXN 10000
long long gcd(long long a,long long b)
{
return b?gcd(b,a%b):a;
}
long long pow(long long a,long long b)
{
long long res=;
while(b)
{
if(b&)
{
res*=a;
}
a*=a;
b>>=;
}
return res;
}
int main()
{
long long n,m;
while(scanf("%I64d%I64d",&m,&n),n+m)
{
long long ans=;
for(int i=;i<=n;i++)
{
ans+=pow(m,gcd(n,i));
}
if(n&)
{
ans+=n*pow(m,n/+);
}
else
{
ans+=n/*pow(m,n/)+n/*pow(m,n/+);
}
printf("%I64d\n",ans//n);
}
return ;
}
2154不允许镜像对称,只考虑旋转的情况
但是n很大。o(n)会超时,因此需要用优化。。
然后去学习了一种欧拉函数优化方法:
只枚举循环节的个数 ,然后计算出这样的置换有多少个,再统计即可
假设某种置换的循环节个数为 d,那么我们所求的就是满足gcd(n,i)=d 的 i 的个数
显然 i 应该是 d的倍数,令i =q*d,再令 n=p*d;
等式变为gcd(p*d,q*d)==d, 即 p,q 互质
而由n>=i 可知 p>=d 要对每一个p,求小于等于p且与p互质的数。。显然是求 p的欧拉函数了
具体见代码:
#include <iostream>
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<ctype.h>
using namespace std;
#define maxn 100000
int phi(int n)
{
int res=n;
for(int i=;i*i<=n;i++)
{
if(n%i==)
{
res=res/i*(i-);
}
while(n%i==)
n/=i;
}
if(n>)
res=res/n*(n-);
return res;
}
int pow(int a,int b,int mod)
{
int res=;
a%=mod;
while(b)
{
if(b&)
{
res*=a;
res%=mod;
}
a*=a;
a%=mod;
b>>=;
}
return res;
}
int main()
{
int t;
int n,p;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&p);
int ans=;
for(int i=;i*i<=n;i++)
{
if(n%i)
continue;
if(i*i==n)
{
ans+=phi(i)%p*pow(n,n/i-,p);
ans%=p;
}
else
{
ans+=phi(i)%p*pow(n,n/i-,p);
ans%=p;
ans+=phi(n/i)%p*pow(n,i-,p);
ans%=p;
}
}
cout<<ans<<endl;
}
return ;
}
poj2409 & 2154 polya计数+欧拉函数优化的更多相关文章
- poj 2154 Color(polya计数 + 欧拉函数优化)
http://poj.org/problem?id=2154 大致题意:由n个珠子,n种颜色,组成一个项链.要求不同的项链数目.旋转后一样的属于同一种.结果模p. n个珠子应该有n种旋转置换.每种置换 ...
- POJ2154 Color【 polya定理+欧拉函数优化】(三个例题)
由于这是第一天去实现polya题,所以由易到难,先来个铺垫题(假设读者是看过课件的,不然可能会对有些“显然”的地方会看不懂): 一:POJ1286 Necklace of Beads :有三种颜色,问 ...
- poj2154Color polya定理+欧拉函数优化
没想到贱贱的数据居然是错的..搞得我调了一中午+晚上一小时(哦不d飞LJH掉RP毕竟他是BUFF)结果重判就对了五次.. 回归正题,这题傻子都看得出是polya定理(如果你不是傻子就看这里),还没有翻 ...
- HDU 2239 polya计数 欧拉函数
这题模数是9937还不是素数,求逆元还得手动求. 项链翻转一样的算一种相当于就是一种类型的置换,那么在n长度内,对于每个i其循环节数为(i,n),但是由于n<=2^32,肯定不能直接枚举,所有考 ...
- 【poj2154】Color Polya定理+欧拉函数
题目描述 $T$ 组询问,用 $n$ 种颜色去染 $n$ 个点的环,旋转后相同视为同构.求不同构的环的个数模 $p$ 的结果. $T\le 3500,n\le 10^9,p\le 30000$ . 题 ...
- poj2154-color-polyan次二面体+欧拉函数优化
N<=1e9,O(nlogn)的做法会超时.从枚举置换转变为枚举轮换长度,然后可以利用欧拉函数,把复杂度变为O(√n * logn) /*---------------------------- ...
- 【bzoj3518】点组计数 欧拉函数(欧拉反演)
题目描述 平面上摆放着一个n*m的点阵(下图所示是一个3*4的点阵).Curimit想知道有多少三点组(a,b,c)满足以a,b,c三点共线.这里a,b,c是不同的3个点,其顺序无关紧要.(即(a,b ...
- poj2154(polya定理+欧拉函数)
题目链接:http://poj.org/problem?id=2154 题意:n 种颜色的珠子构成一个长为 n 的环,每种颜色珠子个数无限,也不一定要用上所有颜色,旋转可以得到状态只算一种,问有多少种 ...
- 【BZOJ3518】点组计数 欧拉函数
[BZOJ3518]点组计数 Description 平面上摆放着一个n*m的点阵(下图所示是一个3*4的点阵).Curimit想知道有多少三点组(a,b,c)满足以a,b,c三点共线.这里a,b,c ...
随机推荐
- Android 基础组件
基础组件 所有的控件都可以在java代码中创建出来,并且大部分的属性都对应set和get方法,比如 View view = new View(Context context) context是上下文 ...
- atitit。浏览器缓存机制 and 微信浏览器防止缓存的设计 attilax 总结
atitit.浏览器缓存机制 and 微信浏览器防止缓存的设计 attilax 总结 1. 缓存的一些机制 1 1.1. http 304 1 1.2. 浏览器刷新的处理机制 1 1.3. Expir ...
- 第一篇!in和exists性能比较和使用
首先,先看下in和exists的区别: in 是把外表和内表作hash 连接: exists是对外表作loop循环,每次loop循环再对内表进行查询. 普遍的观点是exists比in效率高的.但是这不 ...
- wpf异常:指定的 Visual 不是此 Visual 的上级问题处理解析
WPF在画线的时候,调用Control0.TransformToAncestor(Control1).Transform(new System.Windows.Point(0, 0))方法转换坐标的时 ...
- MegaCLI SAS RAID Management Tool
MegaCLI SAS RAID Management Tool Ver 8.04.08 July 05, 2012 (c)Copyright 2011, LSI Corporation, A ...
- HDu -2844 Coins多重背包
这道题是典型的多重背包的题目,也是最基础的多重背包的题目 题目大意:给定n和m, 其中n为有多少中钱币, m为背包的容量,让你求出在1 - m 之间有多少种价钱的组合,由于这道题价值和重量相等,所以就 ...
- EF中使用Contains方法
第一种情况 var db=new ECEntities(); var list=new []{"8","9"}; var result=from a in db ...
- IIS 7.5 配置伪静态
IIS 7.5 配置伪静态_win服务器_脚本之家 win7下IIS的安装和配置 图文教程详细出处参考:http://www.jb51.net/article/29787.htm http://blo ...
- 批量执行插入的sql和自动补零
DECLARE @invoice_no int SET @invoice_no=3 WHILE @invoice_no<=100 --需要插入的次数 BEGIN --此处需要执行的插入sql文 ...
- js的相关验证
1 var JavaScriptCommon = { /*身份证号码校验*/ VerifyID: function (socialNo) { if (socialNo == "") ...