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:对于偶数个,有珠子对珠子和边对边,循 ...
随机推荐
- 在程序中,你敢怎样使用“goto”语句!
用goto是一个个人爱好的问题.“我”的意见是,十个goto中有九个可以用相应的结构化结构来替换.在那些简单情形下,你可以完全替换掉goto,在复杂的情况下,十个中也有九个可以不用:你可以把部分代码写 ...
- 使用代码辅助生成工具CodeSmith -- 生成NHibernate的映射文件
首先下载CodeSmith工具:在百度云中,在CodeSmith文件夹中. 安装,使用激活工具激活. 然后下载NHibernate模板,也是在百度云中,在CodeSmith文件夹中. 之后直接点击NH ...
- 621 - Secret Research
Secret Research At a certain laboratory results of secret research are thoroughly encrypted. A res ...
- Swift - 给图片添加文字水印(图片上写文字,并可设置位置和样式)
想要给图片添加文字水印或者注释,我们需要实现在UIImage上写字的功能. 1,效果图如下: (在图片左上角和右下角都添加了文字.) 2,为方便使用,我们通过扩展UIImage类来实现添加水印功能 ( ...
- CheckBox in ListView
CheckBox in ListView Listview 在android中是经常用的组件,一些特殊情况下,系统提供的list view item 不够用, 不能满足需求,那么就需要自定义listV ...
- Eclipse用法和技巧五:生成说明文档2
上面一篇文章里面我们介绍了一种生成可以被JDK提取到,生成JavaDoc的添加注释方法.下面再补充一种生成这种注释的方法,上图: 步骤一:光标移动到需要添加注释的语句旁边,快捷键:shift + al ...
- Selenium 出现: Caused by: java.lang.ClassNotFoundException: org.w3c.dom.ElementTraversal
webDriver 运行的时候出现: Caused by: java.lang.ClassNotFoundException: org.w3c.dom.ElementTraversal 解决办法: 只 ...
- Qt图片显示效率的比较 转
转http://blog.sina.com.cn/s/blog_5c70dfc80100r257.html 在Qt中处理图片一般都要用到QImage类,但是QImage的对象不能够直接显示出来,要想能 ...
- <1> perl概述
[root@wx03 1]# cat a1.pl $arr=[1,2,3,4,5,6]; print $arr->[4]."\n"; $hash={a=>1,b=> ...
- cocos2dx+lua编译Android项目
一.简单介绍 cocos2dx版本号:3.2 二.问题及解决方式 1.为项目开启Native支持,把项目转为C++项目. 1>.项目开启C++ Native支持,操作例如以下图 watermar ...