注意一点,n有可能为0,所以要特殊处理,否则穿进polya函数中会导致除数为0,造成Runtime error。
//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/8/3.
// Copyright © 2016年 邵金杰. All rights reserved.
//
#include<cstdio>
typedef long long LL;
LL gcd(LL a,LL b)
{
return b==0?a:gcd(b,a%b);
}
LL Pow(LL a,LL b)
{
LL result=1;
LL base=a;
while(b)
{
if(b&1) result*=base;
base*=base;
b>>=1;
}
return result;
}
LL polya(LL n)
{
LL result=0;
for(LL i=1;i<=n;i++)
result+=Pow(3,gcd(n,i));
if(n%2)
result+=Pow(3,(n+1)/2)*n;
else
result+=(Pow(3,n/2)+Pow(3,n/2+1))*n/2;
return result/n/2;
}
int main()
{
LL n;
while(scanf("%lld",&n)){
if(n==-1) break;
if(n==0) {printf("0\n");continue;}
printf("%lld\n",polya(n));
}
return 0;
}