题意:
给你三种颜色的珠子,每次给你N,问在旋转,翻转之后视作相同的情况下,能组成多少种不同的项链。
思路:
让我们借这道题拯救一下我对POLYA定理的理解...
sigma(m^(gcd(i,n)))
以上是在旋转的时候计数的和,其中m是颜色的数量,n是项链的长度。
一下考虑翻转的情况:
当n是偶数的时候,
有n/2种情况循环节的数量是n/2+1,有n/2种情况是n/2。
当n是奇数的时候,
有n种情况是循环节的数量是n/2+1
别忘了最后要除以循环节总的种类数!!!
坑点:
这题n可能等于0...
RE了一次...
#include<string.h> #include<algorithm> #include<stdio.h> using namespace std; long long quick_pow(long long a,long long b){ long long rel=1; while(b){ if(b&1)rel*=a; a=a*a; b>>=1; } return rel; } int gcd(int a,int b){ return b==0?a:gcd(b,a%b); } int main() { int n; scanf("%d",&n); while(n>=0){ if(n==0){printf("0 ");scanf("%d",&n);continue;} long long ans=0; for(int i=1;i<=n;i++){ ans+=quick_pow(3,gcd(n,i)); } if(n&1){ ans+=n*quick_pow(3,n/2+1); } else{ ans+=n/2*quick_pow(3,n/2+1); ans+=n/2*quick_pow(3,n/2); } printf("%I64d ",ans/n/2); scanf("%d",&n); } }