题目描述:
你有一串长为$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\n",ans/(2*s)); } return 0; }
本文介绍了一道使用Polya定理解决的计数问题,具体是在给定长度和颜色种类的情况下,计算不同珠子串的方案数量,考虑了翻转和旋转后的等价性。通过快速幂和最大公约数算法,提供了完整的C++代码实现。
5681

被折叠的 条评论
为什么被折叠?



