三道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[50]; int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } LL power(LL a,LL n) { LL res=1; while(n) { if(n&1)res*=a; a=a*a; n>>=1; } return res; } int main() { int n,k; while(scanf("%d%d",&k,&n)>0) { if(n+k==0)break; LL ans; if(n&1)ans=n*power(k,n/2+1); else ans=n/2*(power(k,n/2)+power(k,n/2+1)); for(int i=1;i<=n;i++)ans+=power(k,gcd(n,i)); printf("%lld ",ans/(2*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+10],tot; bool vis[N+10]; void init() { tot=0; memset(vis,false,sizeof(vis)); for(int i=2;i<=N;i++) { if(!vis[i]) { prime[tot++]=i; } for(int j=0;j<tot;j++) { if(i*prime[j]>N)break; vis[i*prime[j]]=true; } } } LL power(LL a,LL n) { LL res=1; while(n) { if(n&1)res=res*a%p; a=a*a%p; n>>=1; } return res; } LL Phi(int x) { int res=1; for(int i=0;prime[i]*prime[i]<=x&&x>1;i++) { if(x%prime[i]==0) { res*=prime[i]-1; x/=prime[i]; while(x%prime[i]==0) { x/=prime[i]; res*=prime[i]; } } } if(x>1)res*=x-1; return res; } int primefactor[N<<1],sz; void factor(int x) { sz=0; for(int i=1;i*i<=x;i++) { if(x%i==0) { primefactor[sz++]=i; if(i*i!=x)primefactor[sz++]=n/i; } } } LL solve(int n) { factor(n); LL ans=0; for(int i=0;i<sz;i++) { ans=(ans+Phi(n/primefactor[i])*power(n,primefactor[i]-1))%p; } return ans; } int main() { int T;init(); scanf("%d",&T); while(T--) { scanf("%d%d",&n,&p); printf("%d ",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+10],tot; bool vis[N+10]; struct matrix { int m[12][12]; void zore() { memset(m,0,sizeof(m)); } void unit() { for(int i=0;i<12;i++) for(int j=0;j<12;j++) m[i][j]=i==j; } }g; matrix mult(matrix a,matrix b) { matrix c; c.zore(); for(int k=0;k<m;k++) for(int i=0;i<m;i++) { if(a.m[i][k]==0)continue; for(int j=0;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>0) { if(n&1)res=mult(res,a); a=mult(a,a); n>>=1; } return res; } int calc(int n) { int ans=0; matrix res=quick_power(g,n); for(int i=0;i<m;i++) { ans=(ans+res.m[i][i])%mod; } return ans; } void init() { tot=0; memset(vis,false,sizeof(vis)); for(int i=2;i<=N;i++) { if(!vis[i]) { prime[tot++]=i; } for(int j=0;j<tot;j++) { if(i*prime[j]>N)break; vis[i*prime[j]]=true; } } } LL Phi(int x) { int res=1; for(int i=0;prime[i]*prime[i]<=x&&x>1;i++) { if(x%prime[i]==0) { res*=prime[i]-1; x/=prime[i]; while(x%prime[i]==0) { x/=prime[i]; res*=prime[i]; } } } if(x>1)res*=x-1; return res; } int primefactor[N<<1],sz; void factor(int x) { sz=0; for(int i=1;i*i<=x;i++) { if(x%i==0) { primefactor[sz++]=i; if(i*i!=x)primefactor[sz++]=n/i; } } } int power(int a,int n) { int res=1; a%=mod; while(n) { if(n&1)res=res*a%mod; a=a*a%mod; n>>=1; } return res; } int solve(int n) { factor(n); int ans=0; for(int i=0;i<sz;i++) { ans=(ans+Phi(n/primefactor[i])*calc(primefactor[i]))%mod; } return ans*power(n,mod-2)%mod; } int main() { int T; scanf("%d",&T); init(); while(T--) { scanf("%d%d%d",&n,&m,&k); g.zore(); for(int i=0;i<m;i++) for(int j=0;j<m;j++) g.m[i][j]=1; while(k--) { int u,v; scanf("%d%d",&u,&v); u--;v--; g.m[u][v]=g.m[v][u]=0; } printf("%d ",solve(n)); } }