polya

会了,会了,终于会了

下面   项链,手镯以例子进行解释

关键就是置换群,循环节

区别就是手镯可以翻转,但是项链不可以

题例:输入整数n和t,输出用t种颜色的n颗珠子(每种颜色的珠子的数目没有限制,但是珠子的总数必须是n)能制出的 项链和珠子的个数

旋转:

如果逆时针旋转i颗 珠子的间距,则珠子0,i,2i,,,,构成一个循环。这个循环有n/gcd(i,n)个元素,根据对称性,所有的循环均相同,因此一共有gcd(i,n)个循环

这些置换的不动点总数为for(i=1;i<=n;i++)    gcd(i,n)

                                                            t

翻转:

需要分这种情况讨论,当n为奇数时,对称轴有n条,每条对称轴形成(n-1)/2个长度为2的循环和1个长度为1的循环即(n+1)/2个循环,这些置换的不动点总数为

 (n+1)/2

nt

当n为偶数的时候,有两种对称轴,穿过珠子的对称轴有n/2条,各形成n/2-1个长度为2的循环和2个长度为1的循环,不穿过珠子的对称轴有n/2条,各形成n/2个长度为2的循环

这些置换的不动点总数为 (n/2+1+n/2)

                              n/2t           t

根据polya定理,项链总数为a/n,手镯总数为(a+b)/2n

代码随便  写的  一个

int main()
{
    int n,t;
    while(cin>>n>>t){
        ll pow[maxn];
        pow[0]=1;
        for(int i=1;i<=n;i++){
            pow[i]=pow[i-1]*t;
        }
        ll a=0;
        for(i=0;i<n;i++){
            a+=pow[gcd(i,n)];
        }
        ll b=0;
        if(n%2==1){
            b=n*pow[(n+1)/2];
        }
        else{
            b=n/2*(pow[n/2+1]+pow[n/2]);
        }
        cout<<a/n<<' '<<(b+a)/2/n<<endl;
    }
    return 0;
}

 

posted on 2015-06-08 21:56  AC_WQYYY  阅读(141)  评论(0编辑  收藏  举报

导航