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[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

传送门: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\n",solve(n));

    }

}
View Code

传送门: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\n",solve(n));

    }

}
View Code

 

你可能感兴趣的:(ide)