hdu 3547(Polya计数)

来源:互联网 发布:男士美白面膜推荐 知乎 编辑:程序博客网 时间:2024/05/04 20:25

//根据Polya计数的原理,我们先要求出每个置换群中的循环的个数

//这里有24个置换群,为什么是24个呢?,很容易想到,把每一个面当作正面并按一个方向(顺时针或逆时针)旋转3次,总共6个面,所以就是24个置换群了;

//我们可以先对立方体的8个顶点编号,然后就可以暴力预处理出24置换群的循环个数了,最后就是用Polya的计数公式计数了,代码如下:


#include<stdio.h>#include<string.h>int face[6][8]={    {1,2,3,4,5,6,7,8},    {2,6,4,8,1,5,3,7},    {6,5,8,7,2,1,4,3},    {5,1,7,3,6,2,8,4},    {5,6,1,2,7,8,3,4},    {3,4,7,8,1,2,5,6}};int vis[8];int getcnt(int id){    int ans=0,t;    memset(vis,0,sizeof(vis));    for(int i=0;i<8;i++){        if(!vis[i]){            vis[i]=++ans;            t=face[id][i];            while(t!=i+1){                vis[t-1]=ans;                t=face[id][t-1];            }        }    }    return ans;}int tmp[8],m[8]={1,3,0,2,5,7,4,6};void move(int id){    int i;    for(i=0;i<8;i++) tmp[i]=face[id][m[i]];    for(i=0;i<8;i++) face[id][i]=tmp[i];}int Y[24];long long mod=1;void init(){    int i,j;    for(i=0;i<6;i++){        for(j=0;j<4;j++){            Y[i*4+j]=getcnt(i);            move(i);        }    }    for(i=0;i<15;i++) mod*=10;    mod*=24;}long long mult(long long x,long long y){    long long sum=0; x%=mod;    while(y){        if(y&1) sum=(sum+x)%mod;        x=(x+x)%mod;        y>>=1;    }    return sum;}long long power(long long x,long long y){    long long ans=1; x%=mod;    while(y){        if(y&1) ans=mult(ans,x);        x=mult(x,x);        y>>=1;    }    return ans;}int main(){    int i,cas,T,c;    long long ans;    init();    scanf("%d",&T);    for(cas=1;cas<=T;cas++){        scanf("%d",&c);ans=0;        for(i=0;i<24;i++){            ans=(ans+power(c,Y[i]))%mod;        }        ans/=24;        if(c>111) printf("Case %d: %015I64d\n",cas,ans);        else printf("Case %d: %I64d\n",cas,ans);    }    return 0;}



原创粉丝点击