模板题
注意n==0的情况应该输出0
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int gcd( int a, int b ){
if( a < b ){
return gcd( b, a );
}
return b == 0 ? a : gcd( b, a % b );
}
long long rota( double c, int n ){
long long ans = 0;
for( int i = 1; i <= n; i++ ){
ans += pow( c, gcd( i, n ) );
}
return ans;
}
long long turn( double c, int n ){
long long ans;
if( n % 2 == 0 ){
ans = n / 2 * ( pow( c, n / 2 ) + pow( c, n / 2 + 1 ) );
}else{
ans = n * pow( c, n / 2 + 1 );
}
return ans;
}
long long polya( int c, int n ){
long long ans = 0;
ans += turn( c, n );
ans += rota( c, n );
ans /= 2 * n;
return ans;
}
int main(){
int n;
while( scanf( "%d", &n ) && n != -1 ){
printf( "%lld\n", n == 0 ? 0 : polya( 3, n ) );
}
return 0;
}