poj 2409+2154+2888(Burnside定理)
三道burnside入门题:
Burnside定理主要理解置换群置换后每种不动点的个数,然后n种不动点的染色数总和/n为answer。
对于旋转,旋转i个时不动点为gcd(n,i).
传送门:poj 2409
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstdlib>
#define LL long long
#define N 25
#define mod 1000000007
using namespace std;
LL p[];
int gcd(int a,int b)
{
return b==?a:gcd(b,a%b);
}
LL power(LL a,LL n)
{
LL res=;
while(n)
{
if(n&)res*=a;
a=a*a;
n>>=;
}
return res;
}
int main()
{
int n,k;
while(scanf("%d%d",&k,&n)>)
{
if(n+k==)break;
LL ans;
if(n&)ans=n*power(k,n/+);
else ans=n/*(power(k,n/)+power(k,n/+));
for(int i=;i<=n;i++)ans+=power(k,gcd(n,i));
printf("%lld\n",ans/(*n));
}
}
传送门:poj 2154
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstdlib>
#define LL long long
#define N 35000
#define mod 1000000007
using namespace std;
int n,p;
int prime[N+],tot;
bool vis[N+];
void init()
{
tot=;
memset(vis,false,sizeof(vis));
for(int i=;i<=N;i++)
{
if(!vis[i])
{
prime[tot++]=i;
}
for(int j=;j<tot;j++)
{
if(i*prime[j]>N)break;
vis[i*prime[j]]=true;
}
}
}
LL power(LL a,LL n)
{
LL res=;
while(n)
{
if(n&)res=res*a%p;
a=a*a%p;
n>>=;
}
return res;
}
LL Phi(int x)
{
int res=;
for(int i=;prime[i]*prime[i]<=x&&x>;i++)
{
if(x%prime[i]==)
{
res*=prime[i]-;
x/=prime[i];
while(x%prime[i]==)
{
x/=prime[i];
res*=prime[i];
}
}
}
if(x>)res*=x-;
return res;
}
int primefactor[N<<],sz;
void factor(int x)
{
sz=;
for(int i=;i*i<=x;i++)
{
if(x%i==)
{
primefactor[sz++]=i;
if(i*i!=x)primefactor[sz++]=n/i;
}
}
}
LL solve(int n)
{
factor(n);
LL ans=;
for(int i=;i<sz;i++)
{
ans=(ans+Phi(n/primefactor[i])*power(n,primefactor[i]-))%p;
}
return ans;
}
int main()
{
int T;init();
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&p);
printf("%d\n",solve(n));
}
}
传送门:poj 2888
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstdlib>
#define LL long long
#define N 35000
#define mod 9973
using namespace std;
int n,m,k;
int prime[N+],tot;
bool vis[N+];
struct matrix
{
int m[][];
void zore()
{
memset(m,,sizeof(m));
}
void unit()
{
for(int i=;i<;i++)
for(int j=;j<;j++)
m[i][j]=i==j;
}
}g;
matrix mult(matrix a,matrix b)
{
matrix c;
c.zore();
for(int k=;k<m;k++)
for(int i=;i<m;i++)
{
if(a.m[i][k]==)continue;
for(int j=;j<m;j++)
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
}
return c;
}
matrix quick_power(matrix a,int n)
{
matrix res;
res.unit();
while(n>)
{
if(n&)res=mult(res,a);
a=mult(a,a);
n>>=;
}
return res;
}
int calc(int n)
{
int ans=;
matrix res=quick_power(g,n);
for(int i=;i<m;i++)
{
ans=(ans+res.m[i][i])%mod;
}
return ans;
}
void init()
{
tot=;
memset(vis,false,sizeof(vis));
for(int i=;i<=N;i++)
{
if(!vis[i])
{
prime[tot++]=i;
}
for(int j=;j<tot;j++)
{
if(i*prime[j]>N)break;
vis[i*prime[j]]=true;
}
}
}
LL Phi(int x)
{
int res=;
for(int i=;prime[i]*prime[i]<=x&&x>;i++)
{
if(x%prime[i]==)
{
res*=prime[i]-;
x/=prime[i];
while(x%prime[i]==)
{
x/=prime[i];
res*=prime[i];
}
}
}
if(x>)res*=x-;
return res;
}
int primefactor[N<<],sz;
void factor(int x)
{
sz=;
for(int i=;i*i<=x;i++)
{
if(x%i==)
{
primefactor[sz++]=i;
if(i*i!=x)primefactor[sz++]=n/i;
}
}
}
int power(int a,int n)
{
int res=;
a%=mod;
while(n)
{
if(n&)res=res*a%mod;
a=a*a%mod;
n>>=;
}
return res;
}
int solve(int n)
{
factor(n);
int ans=;
for(int i=;i<sz;i++)
{
ans=(ans+Phi(n/primefactor[i])*calc(primefactor[i]))%mod;
}
return ans*power(n,mod-)%mod;
}
int main()
{
int T;
scanf("%d",&T);
init();
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
g.zore();
for(int i=;i<m;i++)
for(int j=;j<m;j++)
g.m[i][j]=;
while(k--)
{
int u,v;
scanf("%d%d",&u,&v);
u--;v--;
g.m[u][v]=g.m[v][u]=;
}
printf("%d\n",solve(n));
}
}
poj 2409+2154+2888(Burnside定理)的更多相关文章
- poj 1286 Necklace of Beads & poj 2409 Let it Bead(初涉polya定理)
http://poj.org/problem?id=1286 题意:有红.绿.蓝三种颜色的n个珠子.要把它们构成一个项链,问有多少种不同的方法.旋转和翻转后同样的属于同一种方法. polya计数. 搜 ...
- bzoj 1004 [HNOI2008]Cards && poj 2409 Let it Bead ——置换群
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1004 http://poj.org/problem?id=2409 学习材料:https:/ ...
- 我对Burnside定理的理解
我想了想,发现可以证明burnside定理. 置换:n个元素1,2,-,n之间的一个置换表示1被1到n中的某个数a1取代,2被1到n中的某个数a2取代,直到n被1到n中的某个数an取代,且a1,a2, ...
- HUST 1569(Burnside定理+容斥+数位dp+矩阵快速幂)
传送门:Gift 题意:由n(n<=1e9)个珍珠构成的项链,珍珠包含幸运数字(有且仅由4或7组成),取区间[L,R]内的数字,相邻的数字不能相同,且旋转得到的相同的数列为一种,为最终能构成多少 ...
- 埋锅。。。BZOJ1004-置换群+burnside定理+
看这道题时当时觉得懵逼...这玩意完全看不懂啊...什么burnside...难受... 于是去看了点视频和资料,大概懂了置换群和burnside定理,亦步亦趋的懂了别人的代码,然后慢慢的打了出来.. ...
- 【Burnside定理】&【Pólya定理】
Burnside & Pólya (详细内容请参阅<组合数学>或2008年cyx的论文,这里只写一些我学习的时候理解困难的几个点,觉得我SB的请轻鄙视……如果有觉得不科学的地方欢迎 ...
- BZOJ1004 [HNOI2008]Cards 【burnside定理 + 01背包】
题目链接 BZOJ1004 题解 burnside定理 在\(m\)个置换下本质不同的染色方案数,等于每种置换下不变的方案数的平均数 记\(L\)为本质不同的染色方案数,\(m\)为置换数,\(f(i ...
- poj 1286 Necklace of Beads poj 2409 Let it Bead HDU 3923 Invoker <组合数学>
链接:http://poj.org/problem?id=1286 http://poj.org/problem?id=2409 #include <cstdio> #include &l ...
- poj 2409 Let it Bead【polya定理+burnside引理】
两种置换 旋转:有n种,分别是旋转1个2个--n个,旋转i的循环节数位gcd(i,n) 翻转:分奇偶,对于奇数个,只有一个珠子对一条边的中点,循环节数为n/2+1:对于偶数个,有珠子对珠子和边对边,循 ...
随机推荐
- PHP - 操作符与控制结构
第3章 操作符与控制结构 学习要点: 1.字符串插入 2.操作符 3.控制结构 一.字符串插入 为了给开发人员处理字符串值提供最大的灵活性,PHP为字面插入和内容插入提供了一种方法. 双引号提供了最大 ...
- Eclipse用法和技巧十九:eclipse修改workspace
工作中某一个项目的文件一般都在某一个路径,大多数人都习惯固定eclipse的workspace.不过偶尔也有点别的,比如做一个大项目中穿插着做些OJ,或者别的……这个时候当然可以选择在安装一个ecli ...
- Python笔记之面向对象
1.类和对象 #create a class class fruit: def say(self): print "hello, python" if __name__ == &q ...
- S3C3440看门狗驱动程序
S3C3440看门狗驱动程序 http://www.cnblogs.com/lfsblack/archive/2012/09/13/2684079.html 看门狗是当CPU进入错误状态后,无法恢复的 ...
- Silverlight技术调查(3)——国际化
原文 Silverlight技术调查(3)——国际化 网上有很多关于Silverlight国际化的说明,包括MSDN的示例,都没有强调一点,下面以红色标示,基础国际化知识请先参考MSDN相关章节,关键 ...
- BCM wifi驱动学习
BCMwifi驱动学习 一.wifi详解1 1.代码路径:Z:\home\stonechen\svn\TD550_X\TD550\3rdparty\wifi\BCM43362\special\bcmd ...
- cocos2d学习笔录1
CCDirector的主要作用: 1.访问和改变场景: 2.访问cocos2d-x的配置细节 3.访问视图(OPENGL,UIVIEW,UIWINDOW): 4.暂停,恢复和结束游戏: 5.在UIKi ...
- 基于visual Studio2013解决面试题之0710求方优化
题目
- 设计模式6:Composite
Entry.java: package gendwang.cisco.com; public abstract class Entry { private int height = 0; privat ...
- Swift - 创建并设置背景(SpriteKit游戏开发)
1,先把背景图片bg.jpg,bg@2x.jpg直接拖进Images.xcassets中 2,设置如下代码(背景图直接铺满整个屏幕) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...