zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    pytorch 文本输入处理
    理解 on-policy 和 off-policy
    Monte Carlo与TD算法
    Monte Calro Tree Search (MCTS)
    强化学习概览
    linux 服务器 keras 深度学习环境搭建
    sed和awk学习整理
    linux shell编程进阶学习(转)
    gdb调试:
    MySQL C API 访问 MySQL 示例
  • 原文地址:https://www.cnblogs.com/ACWQYYY/p/4562066.html
Copyright © 2011-2022 走看看