三道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\n",ans/(2*n)); } }