参考:https://blog.csdn.net/sr_19930829/article/details/38108871
1 #include <iostream> 2 #include <string.h> 3 using namespace std; 4 int c,n;//c种颜色,n个珠子 5 int ans; 6 7 int gcd(int a,int b) 8 { 9 return b==0?a:gcd(b,a%b); 10 } 11 12 int power(int p,int n)//快速幂求公式里的k的nc(g)次方 13 { 14 int ans=1; 15 while(n) 16 { 17 if(n&1) 18 ans*=p; 19 p*=p; 20 n/=2; 21 } 22 return ans; 23 } 24 25 int main() 26 { 27 while(cin>>c>>n&&(c||n)) 28 { 29 ans=0; 30 for(int i=1;i<=n;i++) 31 ans+=power(c,gcd(n,i));//相当于求图3-1中左边的循环群染色数 32 if(n&1)//是奇数,有n个包含(n/2+1)个循环节的循环群 33 ans+=n*power(c,n/2+1); 34 else 35 ans+=(power(c,n/2+1)+power(c,n/2))*(n/2); 36 ans/=2*n;//别忘了除以置换群的总个数 37 cout<<ans<<endl; 38 } 39 return 0; 40 }