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,也就是循环个数 ...
随机推荐
- Windows server 2008 R2 + IIS7.5,ASP网站设置
Windows server 2008 R2 + IIS7.5,ASP网站设置 1. 让IIS7支持ASP Win2008 IIS7 默认不安装ASP,如果需要ASP 的支持,需要将这个角色服务选上. ...
- 【BZOJ2286】消耗战(虚树,DFS序,树形DP)
题意:一棵N个点的树上有若干个关键点,每条边有一个边权,现在要将这些关键点到1的路径全部切断,切断一条边的代价就是边权. 共有M组询问,每组询问有k[i]个关键点,对于每组询问求出完成任务的最小代价. ...
- javascript script load related【转】
先来看这行代码: <script src = "allMyClientSideCode.js"></script> 这有点儿……不怎么样.“这该放在哪儿?” ...
- 前端开发 CSS中你所不知道的伪类与伪元素的区别--摘抄
做过前端开发的人都熟悉伪类与伪元素,而真正能够彻底了解这二者的区别的人并不多.伪类与伪元素确实很容易混淆. 伪元素主要是用来创建一些不存在原有dom结构树种的元素,例如:用::before和::aft ...
- json键的不能像值一样拼写的问题
今天碰到了一个json的键不能拼写的问题 解决方法是 先把json对象作为一个字符串拼写 然后再通过eavl函数转为json对象 $(".select_date").each( ...
- 标准C程序设计七---63
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- Charger Battery Warning Message 的 改善
今天與人聊到有關 charger battery safety 的 warning message, 認為說 warning message 真的有起到 保護 user 的作用? 譬如: batter ...
- 现象: shell脚本中source aaa.sh时提示 source: not found
原因: ls -l `which sh` 提示/bin/sh -> dash 这说明是用dash来进行解析的. 改回方法: 命令行执行:sudo dpkg-reconfigure dash 在界 ...
- Codeforces 622C Not Equal on a Segment 【线段树 Or DP】
题目链接: http://codeforces.com/problemset/problem/622/C 题意: 给定序列,若干查询,每个查询给定区间和t,输出区间内任意一个不等于t的元素的位置. 分 ...
- tcp异常断开的重连解决方法
1.select超时重连 http://bbs.chinaunix.net/thread-4162149-1-1.html 2.http://bbs.csdn.net/topics/350074818 ...