poj 2154 Color < 组合数学+数论>
链接:http://poj.org/problem?id=2154
题意:给出两个整数 N 和 P,表示 N 个珠子,N种颜色,要求不同的项链数, 结果 %p ~
思路: 利用polya定理解~定理内容:
设
是n个对象的一个置换群, 用m种颜色染图这n个对象,则不同的染色方案数为:
其中
,
为
的循环节数~本题只有旋转一种置换方式,那么共有 N 个置换, 每个置换的循环节为 gcd(N,i)~
令L==N/a, i==a*t, 即 a==gcd(N, i)==gcd(L*a, t*a), 此时只要满足 gcd(L, t)==1即可. 而1<=i<=N 即 1<=t<=N/a==L~
所以t的个数为 L 的欧拉函数, 所以 结果为:∑(Euler(L)*(n^(N/L)))%p ,为了避免最后做除法结果可化为∑(Euler(L)*(n^(N/L-1)))%p。
#include <iostream>
#include <cstdio>
using namespace std;
const int MN = 5e4;
typedef long long LL;
int a[MN],p[MN], T, N, M, k;
LL P_M( int a, int b )
{
LL res=, t=(LL)a%M;
while(b){
if(b&)res=(res*t)%M;
t=(t*t)%M;
b>>=;
}
return res;
}
void getp( )
{
for( int i=; i*i<=MN; i+= ){
if(!a[i])
for( int j=i+i; j<=MN; j+=i )
a[j]=;
}
p[]=, k=;
for( int i=; i<MN ; i+= )
if(!a[i]) p[k++]=i;
}
int Euler( int x)
{
int res=x;
for( int i=; i<k&&p[i]*p[i]<=x; ++ i ){
if(x%p[i]==){
res=res/p[i]*(p[i]-);
while(x%p[i]==){ x=x/p[i];
}
}
}
if(x>)
res=res/x*(x-);
return res;
}
int main( )
{
getp();
scanf("%d", &T);
while(T--){
scanf("%d%d", &N, &M);
int i;
LL ans=;
for( i=; i*i<N; ++ i ){ if(N%i==){
ans+=(LL)Euler(i)%M*P_M(N, N/i-);
ans%=M;
ans+=(LL)Euler(N/i)%M*P_M(N, i-);
ans%=M;
} }
if(i*i==N){
ans+=(LL)Euler(i)%M*P_M(N, i-);
ans%=M;
}
printf("%lld\n", ans);
}
return ;
}
poj 2154 Color < 组合数学+数论>的更多相关文章
- POJ 2154 Color [Polya 数论]
和上题一样,只考虑旋转等价,只不过颜色和珠子$1e9$ 一样的式子 $\sum\limits_{i=1}^n m^{gcd(i,n)}$ 然后按$gcd$分类,枚举$n$的约数 如果这个也化不出来我莫 ...
- 组合数学 - 波利亚定理 --- poj : 2154 Color
Color Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7873 Accepted: 2565 Description ...
- poj 2154 Color——带优化的置换
题目:http://poj.org/problem?id=2154 置换的第二道题! 需要优化!式子是ans=∑n^gcd(i,n)/n (i∈1~n),可以枚举gcd=g,则有phi( n/g )个 ...
- [ACM] POJ 2154 Color (Polya计数优化,欧拉函数)
Color Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7630 Accepted: 2507 Description ...
- poj 2154 Color(polya计数 + 欧拉函数优化)
http://poj.org/problem?id=2154 大致题意:由n个珠子,n种颜色,组成一个项链.要求不同的项链数目.旋转后一样的属于同一种.结果模p. n个珠子应该有n种旋转置换.每种置换 ...
- poj 2154 Color
这是道标准的数论优化的polya题.卡时卡的很紧,需要用int才能过.程序中一定要注意控制不爆int!!!我因为爆intWA了好久=_=…… 题目简洁明了,就是求 sigma n^gcd(i,n):但 ...
- POJ 2154 color (polya + 欧拉优化)
Beads of N colors are connected together into a circular necklace of N beads (N<=1000000000). You ...
- POJ 2154 Color ——Burnside引理
[题目分析] 数据范围有些大. 然后遍求欧拉函数,遍求和就好了,注意取模. [代码] #include <cstdio> #include <cstring> #include ...
- poj 2154 Color 欧拉函数优化的ploya计数
枚举位移肯定超时,对于一个位移i.我们须要的是它的循环个数,也就是gcd(i,n),gcd(i,n)个数肯定不会非常多,由于等价于n的约数的个数. 所以我们枚举n的约数.对于一个约数k,也就是循环个数 ...
随机推荐
- 【CF652C】Foe Pairs(线性扫描)
题意:给你1-n的一个排列和m组数对,问有多少区间不包含任意一个数对. (1 ≤ n, m ≤ 3·105) 思路:数据范围过大,不能用容斥原理 f[i]表示以位置i上的数为左端点,右端点最小到哪里 ...
- 用Vue创建一个新的项目
vue的安装 Vue.js不支持IE8及以下版本.因为Vue.js使用了ECMAScript5特性,IE8显然不能模拟.Vue.js支持所有兼容ECMAScript5的浏览器. 在用Vue.js构建大 ...
- 转 Perl函数返回值用法指导
http://developer.51cto.com/art/201007/213003.htm Perl函数返回值用法指导 Perl编程语言中Perl函数返回值用法你是否比较熟悉,这里向大家简单 ...
- POJ 1011:木棒
传送门 http://poj.org/problem?id=1011 题目大意 已知原来有等长若干木棒,现在给你一堆断了的木棒的长度,问原来的木棒最短是多长 题目类型 DFS + 剪枝 + “贪心优化 ...
- [Bzoj3687]简单题(bitset)
3687: 简单题 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1150 Solved: 565[Submit][Status][Discuss] ...
- 扩展欧几里得算法(exGCD)学习笔记
@(学习笔记)[扩展欧几里得] 本以为自己学过一次的知识不会那么容易忘记, 但事实证明, 两个星期后的我就已经不会做扩展欧几里得了...所以还是写一下学习笔记吧 问题概述 求解: \[ax + by ...
- Attempt to invoke virtual method 'void android.app.ActionBar.setTitle的解决方法
在安卓4.4.2的关于蓝牙开发的一个sample BluetoothChat中,调试时,老是出错:Attempt to invoke virtual method 'void android.app. ...
- K-L变换
K-L变换( Karhunen-Loeve Transform)是建立在统计特性基础上的一种变换,有的文献也称为霍特林(Hotelling)变换,因他在1933年最先给出将离散信号变换成一串不相关系数 ...
- spring security开发步骤
1.web.xml中加载spring ,spring security 2.spring security配置文件中配置好.... 3.自己写一个myFilter代替原有的FilterSecurity ...
- 混合背包 hdu5410 CRB and His Birthday
传送门:点击打开链接 题意:你有M块钱,如今有N件商品 第i件商品要Wi块,假设你购买x个这种商品.你将得到Ai*x+Bi个糖果 问能得到的最多的糖果数 思路:很好的一道01背包和全然背包结合的题目 ...