三道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定理)的更多相关文章

  1. poj 1286 Necklace of Beads &amp; poj 2409 Let it Bead(初涉polya定理)

    http://poj.org/problem?id=1286 题意:有红.绿.蓝三种颜色的n个珠子.要把它们构成一个项链,问有多少种不同的方法.旋转和翻转后同样的属于同一种方法. polya计数. 搜 ...

  2. 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:/ ...

  3. 我对Burnside定理的理解

    我想了想,发现可以证明burnside定理. 置换:n个元素1,2,-,n之间的一个置换表示1被1到n中的某个数a1取代,2被1到n中的某个数a2取代,直到n被1到n中的某个数an取代,且a1,a2, ...

  4. HUST 1569(Burnside定理+容斥+数位dp+矩阵快速幂)

    传送门:Gift 题意:由n(n<=1e9)个珍珠构成的项链,珍珠包含幸运数字(有且仅由4或7组成),取区间[L,R]内的数字,相邻的数字不能相同,且旋转得到的相同的数列为一种,为最终能构成多少 ...

  5. 埋锅。。。BZOJ1004-置换群+burnside定理+

    看这道题时当时觉得懵逼...这玩意完全看不懂啊...什么burnside...难受... 于是去看了点视频和资料,大概懂了置换群和burnside定理,亦步亦趋的懂了别人的代码,然后慢慢的打了出来.. ...

  6. 【Burnside定理】&【Pólya定理】

    Burnside & Pólya (详细内容请参阅<组合数学>或2008年cyx的论文,这里只写一些我学习的时候理解困难的几个点,觉得我SB的请轻鄙视……如果有觉得不科学的地方欢迎 ...

  7. BZOJ1004 [HNOI2008]Cards 【burnside定理 + 01背包】

    题目链接 BZOJ1004 题解 burnside定理 在\(m\)个置换下本质不同的染色方案数,等于每种置换下不变的方案数的平均数 记\(L\)为本质不同的染色方案数,\(m\)为置换数,\(f(i ...

  8. 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 ...

  9. poj 2409 Let it Bead【polya定理+burnside引理】

    两种置换 旋转:有n种,分别是旋转1个2个--n个,旋转i的循环节数位gcd(i,n) 翻转:分奇偶,对于奇数个,只有一个珠子对一条边的中点,循环节数为n/2+1:对于偶数个,有珠子对珠子和边对边,循 ...

随机推荐

  1. 重设mysql数据库root用户密码

     原文:http://blog.sina.com.cn/s/blog_a3695da601010mrs.html   1, 启用任务管理器,结束mysql进程   2,进入命令行,进入mysql的bi ...

  2. ajax跨域请求--jsonp实例

    ajax请求代码: //区域事件选择配送点 function changeDistrict(value){ if(value == 0){ $('#transport_node').empty(); ...

  3. I/O操作技术

     对I/O操作有三种可能的技术:可编程I/O.中断驱动I/O.直接内存存取(DMA) 可编程I/O 当处理器正在运行程序并遇到一个与I/O相关的指令时,它通过给对应的I/O模块发命令来运行这个指令 ...

  4. 私有析构函数 Android 代码分析

    有人说声明 Private Destructor, 这对象只能在 stack 上创建,不能在Heap上创建, 其实错了, 这样的程序编译都过不了. 那为何会有 Private Destructor, ...

  5. 基于 SSH 的工具叫 sshfs. sshfs 可以让你在本地直接挂载远程主机的文件系统

    另外一个很赞的基于 SSH 的工具叫 sshfs. sshfs 可以让你在本地直接挂载远程主机的文件系统. $ sshfs -o idmap=user user@hostname:/home/user ...

  6. 在Windows下编译OpenSSL(VS2005和VC6)

    需要说明的是请一定安装openssl-0.9.8a .  openssl-1.0.0我没有编译成功. 如何在Windows下编译OpenSSL (Vs2005使用Vc8的cl编译器)1.安装Activ ...

  7. [Windows Phone]常用类库&API推荐

    原文 [Windows Phone]常用类库&API推荐 简介: 把自己的应用程序搭建在稳定的API之上,这会使得我们在开发时能把精力都集中在程序的业务逻辑之上,避免重复造轮子,并且使得程序结 ...

  8. cocos2d-x游戏开发系列教程-坦克大战游戏之坦克的显示

    1.先定义坦克的一些属性 class Tank : public CCSprite { public : Tank(); ~Tank(); static Tank* createTankWithTan ...

  9. 如何删除JAVA集合中的元素

    经常我们要删除集合中的某些元素.有些可能会这么写. public void operate(List list){ for (Iterator it = list.iterator(); it.has ...

  10. 一些实用的mysql语句(不断积累更新)

    1.数据表里仅仅有生日字段,想计算出其年龄的mysql语句: SELECT *,DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW( ))-TO_DAYS(生日字段)),'%Y')+0 ...