zoukankan      html  css  js  c++  java
  • 【POJ2409】Let it Bead Pólya定理

    【POJ2409】Let it Bead

    题意:用$m$种颜色去染$n$个点的环,如果两个环在旋转或翻转后是相同的,则称这两个环是同构的。求不同构的环的个数。
    $n,m$很小就是了。
    题解:在旋转$i$次后,循环节的个数显然是$gcd(i,n)$。
    如果考虑翻转,我们将点从$0$到$n-1$标号,令其先以0到圆心的连线为对称轴翻转,再旋转i次,则原来编号为x的会变成$n-x+i mathrm{mod} n$,令$n-x+i=x mathrm{mod} n$,则$2x=i$或$2x=n+i$。
    分奇偶性讨论一下循环节的个数即可。
    最后套用Pólya定理。
    其实n=2的情况是算重了的,不过你会发现每种情况都恰好被算了两次,所以就不用管了。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    typedef long long ll;
    int n,m;
    ll ans;
    ll pw[35];
    int gcd(int a,int b)
    {
    	return !b?a:gcd(b,a%b);
    }
    int main()
    {
    	while(1)
    	{
    		scanf("%d%d",&m,&n);
    		if(!n&&!m)	return 0;
    		int i;
    		for(pw[0]=i=1;i<=n;i++)	pw[i]=pw[i-1]*m;
    		for(ans=i=0;i<n;i++)
    		{
    			ans+=pw[gcd(n,i)];
    			if(n&1)	ans+=pw[(n+1)>>1];
    			else	ans+=pw[(n>>1)+!(i&1)];
    		}
    		printf("%lld
    ",ans/2/n);
    	}
    }
    
  • 相关阅读:
    内核模块的一些问题
    [转]change the linux startup logo
    raspbian 静态IP
    [转]centos7 配置yum源(本地+光盘)
    [转]source inslght使用指导
    T420修改wifi灯闪动模式
    root运行chrome
    [转]理解阻塞非阻塞与同步异步
    [转] 计算机体系架构分类
    Win7下安装 Oracle Virtual Box
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/8227349.html
Copyright © 2011-2022 走看看