POJ 2409-Let it Bead(Polya计数)
题目地址:POJ 2409
题意:给一个包括s个珠子的项链,用c种颜色对其染色,问存在多少个不同的项链。
思路:和上一篇POJ 1286几乎相同。
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <set> #include <queue> #include <stack> #include <map> //#pragma comment(linker, "/STACK:102400000,102400000") using namespace std; typedef long long LL; const int inf=0x3f3f3f3f; const double pi= acos(-1.0); const double esp=1e-6; LL gcd(LL a,LL b) { while(b!=0) { LL r=b; b=a%b; a=r; } return a; } LL modxp(LL a,LL b) { LL res=1; while(b!=0) { if(b&1) res*=a; a=a*a; b>>=1; } return res; } int main() { LL c,s,i; LL ans; while(~scanf("%lld %lld",&c,&s)) { if(!c&&!s) break; ans=0; for(i=1; i<=s; i++) ans+=modxp(c,gcd(s,i)); if(s&1) { ans+=modxp(c,s/2+1)*s; } else { ans+=modxp(c,s/2+1)*(s/2); ans+=modxp(c,s/2)*(s/2); } printf("%lld\n",ans/(s*2)); } return 0; }