1. 程式人生 > >[ACM] POJ 2409 Let it Bead (Polya計數)

[ACM] POJ 2409 Let it Bead (Polya計數)

圖片 std stream class blank https ima tails ace

參考: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 }

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

[ACM] POJ 2409 Let it Bead (Polya計數)