这两个题都是项链珠子的染色问题

也是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计数+欧拉函数优化的更多相关文章

  1. poj 2154 Color(polya计数 + 欧拉函数优化)

    http://poj.org/problem?id=2154 大致题意:由n个珠子,n种颜色,组成一个项链.要求不同的项链数目.旋转后一样的属于同一种.结果模p. n个珠子应该有n种旋转置换.每种置换 ...

  2. POJ2154 Color【 polya定理+欧拉函数优化】(三个例题)

    由于这是第一天去实现polya题,所以由易到难,先来个铺垫题(假设读者是看过课件的,不然可能会对有些“显然”的地方会看不懂): 一:POJ1286 Necklace of Beads :有三种颜色,问 ...

  3. poj2154Color polya定理+欧拉函数优化

    没想到贱贱的数据居然是错的..搞得我调了一中午+晚上一小时(哦不d飞LJH掉RP毕竟他是BUFF)结果重判就对了五次.. 回归正题,这题傻子都看得出是polya定理(如果你不是傻子就看这里),还没有翻 ...

  4. HDU 2239 polya计数 欧拉函数

    这题模数是9937还不是素数,求逆元还得手动求. 项链翻转一样的算一种相当于就是一种类型的置换,那么在n长度内,对于每个i其循环节数为(i,n),但是由于n<=2^32,肯定不能直接枚举,所有考 ...

  5. 【poj2154】Color Polya定理+欧拉函数

    题目描述 $T$ 组询问,用 $n$ 种颜色去染 $n$ 个点的环,旋转后相同视为同构.求不同构的环的个数模 $p$ 的结果. $T\le 3500,n\le 10^9,p\le 30000$ . 题 ...

  6. poj2154-color-polyan次二面体+欧拉函数优化

    N<=1e9,O(nlogn)的做法会超时.从枚举置换转变为枚举轮换长度,然后可以利用欧拉函数,把复杂度变为O(√n * logn) /*---------------------------- ...

  7. 【bzoj3518】点组计数 欧拉函数(欧拉反演)

    题目描述 平面上摆放着一个n*m的点阵(下图所示是一个3*4的点阵).Curimit想知道有多少三点组(a,b,c)满足以a,b,c三点共线.这里a,b,c是不同的3个点,其顺序无关紧要.(即(a,b ...

  8. poj2154(polya定理+欧拉函数)

    题目链接:http://poj.org/problem?id=2154 题意:n 种颜色的珠子构成一个长为 n 的环,每种颜色珠子个数无限,也不一定要用上所有颜色,旋转可以得到状态只算一种,问有多少种 ...

  9. 【BZOJ3518】点组计数 欧拉函数

    [BZOJ3518]点组计数 Description 平面上摆放着一个n*m的点阵(下图所示是一个3*4的点阵).Curimit想知道有多少三点组(a,b,c)满足以a,b,c三点共线.这里a,b,c ...

随机推荐

  1. [转] 强大的python字符串解析

    1.python字符串通常有单引号('...').双引号("...").三引号("""...""")或('''...'' ...

  2. [转] Java内部类之闭包(closure)与回调(callback)

    闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为它 不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥 ...

  3. Java基础知识强化93:算一下你来到这个世界多少天的案例

    1. 分析: (1)键盘录入你的出生年月日 (2)把该字符串转换为一个日期 (3)通过该日期得到一个毫秒值 (4)获取当前时间的毫秒值 (5)用(4)-(3)得到一个毫秒值 (6)把E的毫秒值转换为天 ...

  4. Shell基本的命令

    ubuntu 中文乱码 如果使用的是 PuTTY,可以通过修改 font, character set 设置来解决. Window -> Appearance -> Font settin ...

  5. 商品标签例子——CSS3 transform 属性

    积累很重要.从此开始记录前端生涯的点滴.... <!DOCTYPE html><html lang="en"><head> <meta c ...

  6. Android开发手记(7) 按钮类控件的使用

    1.点击Button改变页面背景色 通过Button改变页面背景色,首先新建相应的对象,让后绑定到Layout上的元素. final RelativeLayout layout = (Relative ...

  7. oracle查询blob类型

    下午要查询一个数据,要求是从 表t_report 中查找出 mainbody字段中包含“hibernate”字符串的所有信息.而mainbody字段是blob类型.百度后终于找到答案: DBMS_LO ...

  8. 详解boost库中的Message Queue .

    Message Queue(后文简写成MQ或消息队列)是boost库中用来封装进程间通信的一种实现,同一台机器上的进程或线程可以通过消息队列来进行通迅.消息队列中的消息由优先级.消息长度.消息数据三部 ...

  9. PHPCMS V9网站更换域名的方法

    网站在发展的过程中,很可能多次的修改域名.那么在phpcms v9中我们要怎么进行设置呢? 请进行以下步骤的修改: 1.修改/caches/configs/system.php里面所有和域名有关的,把 ...

  10. CSS代码写出的各种形状图形

    做网页设计时经常要用到各种形状的图形,对于规则的图形很简单,但是对于不规则的图形,一般我们都是用图片,今天就在这里教大家怎样用css代码写出各种规则不同的图形 1.正方形 #square {width ...