poj2409Let it Bead Polay定理

42 篇文章 0 订阅
3 篇文章 0 订阅

题意:给出一个长度为m的项链,每个珠子可以用n种颜色涂色。翻转和旋转后相同的算作一种。有多少种不同的项链?

思路:

(1)

对于Burnside引理,G为所有置换集合,|G|为所有置换个数,gi为第i种置换,D(gi)为在第i种置换下保持不动的元素个数。

对于Polay定理,G为所有置换集合,|G|为所有置换个数,gi为第i种置换,n为颜色的种类,c(gi)为第i种置换的循环节个数。

(2)对于Polay,一般解题步骤:确定循环群;计算每种循环下的循环节个数。

对于本题,旋转可以分为旋转i=0,1,2,……m-1个,循环节个数为Gcd(m,i)。对于翻转,若m为奇数,只有通过一顶点和其对边中点的轴翻转,循环节m/2+1;对于m为偶数,两种翻转的轴,第一是两个顶点的连线,循环节m/2+1,第二是对边中点的连线,循环节m/2。


#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
#define ll long long
int gcd(int a,int b) {return a%b==0?b:gcd(b,a%b);}
ll quickpow(ll m,ll n)
{
    ll res=1;
    while(n)
    {
        if(n&1)
        res=res*m;
        n=n>>1;
        m=m*m;
    }
    return res;
}
int main()
{
    ll c,n;
    while(~scanf("%lld%lld",&c,&n))
    {
        if(c+n==0)
            break;
        ll ans=quickpow(c,n);
        for(int i=1;i<n;i++)
        ans+=quickpow(c,gcd(n,i));
        if(n&1) ans+=n*quickpow(c,n/2+1);
        else ans+=(n/2*quickpow(c,n/2+1)+n/2*(quickpow(c,n/2)));
        printf("%lld\n",ans/(2*n));
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值