您的位置:首页 > 其它

poj 2409 Let it Bead

2017-05-02 19:13 239 查看
题意:

• ⽤ m 种颜⾊给⼀个有 n 个珠⼦的项链染色

• 考虑旋转、翻转同构,求⽅案数

【分析】

polya计数法…第一题。

并不会证明…

1.考虑旋转同构,那么n个珠子的项链总共n种旋转置换,对于旋转i个珠子的置换,循环节个数为gcd(n,i),至于为什么大家可以画个图出来感性理解一下…

2.考虑翻转同构,对于n为奇数,翻转对称轴必定经过其中一个珠子,所以总共有n种相同情况,每种情况循环节有(n+1)/2个。对于n为偶数,有n/2个翻转对称轴经过珠子,有n/2个不经过珠子,循环节个数分别为n/2+1和n/2个…

然后暴力求解即可。

【代码】

//poj 2409 Let it Bead
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long
#define M(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
ll ans;
int n,m;
inline int gcd(int x,int y)
{
return x%y==0?y:gcd(y,x%y);
}
int main()
{
int i,j;
while(scanf("%d%d",&m,&n))
{
if(!n && !m) return 0;
ans=0;
fo(i,1,n)
ans+=pow(m,gcd(n,i));
if(n&1)
ans+=n*pow(m,(n+1)/2);
else
ans+=n/2*pow(m,n/2+1)+n/2*pow(m,n/2);
printf("%lld\n",ans/n/2);
}
}
//but the world keeps spinning around.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: