三道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));
    }
}
View Code

相关文章: