简单的polya定理
在加上一些旋转翻转操作的思考,还有坑点
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n==-1) break;
if(n==0) //n可能是0
{
printf("0\n");
continue;
}
ll ans=0;
for(int i=1;i<=n;i++)
ans+=pow(3l,gcd(n,i)); //旋转操作
if(n&1)
{
ans+=n*pow(3l,n/2+1); //n为奇数的翻转
}
else //n为偶数的翻转
{
ans+=n/2*pow(3l,n/2+1);
ans+=n/2*pow(3l,n/2);
}
ans/=2*n;
printf("%d\n",ans);
}
return 0;
}