直接套,n==0时要特判,还有输出结果要用__int64
#include<stdio.h>
#include<math.h>
int gcd(int a,int b) {
if (b==0) return a;
else return gcd(b,a%b);
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int n;
while(scanf("%d",&n)) {
if (n==0) {
printf("0\n");
continue;
}
if (n==-1) break;
int i;pow(
__int64 ans=0;
for(i=0;i<n;i++) {
ans+=pow(3.0,gcd(n,i));
}
if (n%2==0) {
ans+=n/2*pow(3.0,n/2+1);
ans+=n/2*pow(3.0,n/2);
}
else ans+=n*pow(3.0,n/2+1);
ans/=2*n;
printf("%I64d\n",ans);
}
return 0;
}