题目描述:
你有一串长为$s$的珠子,每个珠子可以涂$c$种颜色。
两方案相同当且仅当翻转/旋转后相同。
求不同方案数。
题解:
$Polya$裸题。
代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; int c,s; ll fastpow(ll x,int y) { ll ret = 1; while(y) { if(y&1)ret=ret*x; x=x*x; y>>=1; } return ret; } int gcd(int x,int y) { return y?gcd(y,x%y):x; } int main() { while(scanf("%d%d",&c,&s)) { if(!c&&!s)break; if(!c||!s) { puts("0"); continue; } ll ans = 0; for(int i=1;i<=s;i++) ans+=fastpow(c,gcd(i,s)); if(s&1)ans+=1ll*s*fastpow(c,(s+1)>>1); else ans+=1ll*(s>>1)*fastpow(c,s>>1)+1ll*(s>>1)*fastpow(c,(s>>1)+1); printf("%I64d ",ans/(2*s)); } return 0; }