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 ...
随机推荐
- POJ Farm Tour
Farm Tour 题目: 约翰有N块地,家在1号,而N号是个仓库.农场内有M条道路(双向的),道路i连接这ai号地和bi号地,长度为ci. 约翰希望依照从家里出发,经过若干地后达到仓库.然后再返回家 ...
- 要缩小通过两个触摸点的观点(iOS)
于AppDelegate.m档,创建一个视图控制器 #import "MAYAppDelegate.h" #import "MAYViewController.h&quo ...
- 读取Excel数据绑定到Gridview进行显示
读取Excel数据绑定到Gridview进行显示示例代码. 读取excel代码 /// <summary> /// 读取Excel /// authon:codeo.cn /// < ...
- android 接听和挂断实现方式
参考:android 来电接听和挂断 支持目前所有版本 注意:android2.3版本及以上不支持下面的自动接听方法. (会抛异常:java.lang.SecurityException: Neith ...
- ServletContextListener 解析用法
ServletContext 被 Servlet 程序用来与 Web 容器通信.例如写日志,转发请求.每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享.因为Context可 ...
- Asp 图形化报表
1 图形化的报表的优点 分析.统计业务数据 表现直观,漂亮,有震撼效果的图形化的方式展现业务数据 复杂的业务数据简单化 2 常用的报表组件 HighCharts:是纯js编写的图形化报表 水晶报表 ...
- apache的500错误是写到哪个文件里面
apache的500错误是写到哪个文件里面
- Design Pattern ——Builder
一.基础知识:先前学习建造者模式的时候,总是以这个UML图作为学习基础资料 然后总是要记住四个角色 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量.在本类图中 ...
- Entity Framework 新增实体,新增抽象实体
抽象实体不能new 抽象类:人,实体类:学生 人 p_人= new 学生(); 添加数据,学生和人都添加 抽象类可以提供一个抽象的方法,但是并没有实现,类似接口,但又不同于接口.子类继承父类时必须 ...
- JavaScript 显示弹出窗口
window . showModalDialog ( sURL,vArguments , sFeatures )参数说明: sURL--必选参数,用来指定对话框要显示的文档的URL. //要显示页面的 ...