题目:http://poj.org/problem?id=2409
这个题目 也是比较裸的题目了。在做这个题目的时候突然想到一个问题,polya定理是不是必须要把所有的颜色用完呢?于是想了几个数据测试了一下才明白,并不是把所有颜色用完,而是用小于等color的颜色用于染色,至于怎么计算必须把所有颜色用完的情况,想了很久也 每想出来,就留以后想吧,如果哪位又想法可以留言交流呀!
以下是这个题目的代码:
#include <iostream> #include <stdio.h> #include <string.h> #include <math.h> using namespace std; int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } long long rotate(int c,int n) { long long sum=0; for(int i=1;i<=n;i++) sum+=pow(c,gcd(n,i)); return sum; } long long turn(int c,int n) { long long sum=0; if(n%2) sum+=n*pow(c,(n+1)/2); else sum+=n/2*(pow(c,n/2)+pow(c,(n+2)/2)); return sum; } void polya(int c,int n) { int i,j; long long sum=0; sum+=rotate(c,n); sum+=turn(c,n); printf("%lld\n",sum/(2*n)); } int main() { //freopen("C:\in.txt","r",stdin); //freopen("C:\out.txt","w",stdout); int n,m; while(scanf("%d%d",&n,&m),n||m) { polya(n,m); } return 0; }