[ACM] POJ 2409 Let it Bead (Polya計數)
阿新 • • 發佈:2018-09-04
圖片 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 intans=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計數)