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:对于偶数个,有珠子对珠子和边对边,循 ...
随机推荐
- 重设mysql数据库root用户密码
原文:http://blog.sina.com.cn/s/blog_a3695da601010mrs.html 1, 启用任务管理器,结束mysql进程 2,进入命令行,进入mysql的bi ...
- ajax跨域请求--jsonp实例
ajax请求代码: //区域事件选择配送点 function changeDistrict(value){ if(value == 0){ $('#transport_node').empty(); ...
- I/O操作技术
对I/O操作有三种可能的技术:可编程I/O.中断驱动I/O.直接内存存取(DMA) 可编程I/O 当处理器正在运行程序并遇到一个与I/O相关的指令时,它通过给对应的I/O模块发命令来运行这个指令 ...
- 私有析构函数 Android 代码分析
有人说声明 Private Destructor, 这对象只能在 stack 上创建,不能在Heap上创建, 其实错了, 这样的程序编译都过不了. 那为何会有 Private Destructor, ...
- 基于 SSH 的工具叫 sshfs. sshfs 可以让你在本地直接挂载远程主机的文件系统
另外一个很赞的基于 SSH 的工具叫 sshfs. sshfs 可以让你在本地直接挂载远程主机的文件系统. $ sshfs -o idmap=user user@hostname:/home/user ...
- 在Windows下编译OpenSSL(VS2005和VC6)
需要说明的是请一定安装openssl-0.9.8a . openssl-1.0.0我没有编译成功. 如何在Windows下编译OpenSSL (Vs2005使用Vc8的cl编译器)1.安装Activ ...
- [Windows Phone]常用类库&API推荐
原文 [Windows Phone]常用类库&API推荐 简介: 把自己的应用程序搭建在稳定的API之上,这会使得我们在开发时能把精力都集中在程序的业务逻辑之上,避免重复造轮子,并且使得程序结 ...
- cocos2d-x游戏开发系列教程-坦克大战游戏之坦克的显示
1.先定义坦克的一些属性 class Tank : public CCSprite { public : Tank(); ~Tank(); static Tank* createTankWithTan ...
- 如何删除JAVA集合中的元素
经常我们要删除集合中的某些元素.有些可能会这么写. public void operate(List list){ for (Iterator it = list.iterator(); it.has ...
- 一些实用的mysql语句(不断积累更新)
1.数据表里仅仅有生日字段,想计算出其年龄的mysql语句: SELECT *,DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW( ))-TO_DAYS(生日字段)),'%Y')+0 ...