http://162.105.81.212/JudgeOnline/problem?id=1286

本人第一道polya的题目,polya的入门题,看过polya的应该都没什么问题的。
 1 #include < iostream >
 2 using   namespace  std;
 3 typedef __int64 ll;
 4 int  gcd(  int  a,  int  b ) return b ? gcd( b, a % b ) : a; }
 5 ll pow( ll a, ll n )
 6 {
 7    ll ans = 1,  d = a;
 8    while( n )
 9    {
10        if( n & 1 ) ans = ans * d;
11        d *= d;
12        n >>= 1;
13    }

14    return ans;
15}

16
17 ll solve(  int  n )
18 {
19    int i;
20    ll sum = 0;
21    if( n == 0 )return 0;
22    for( i = 1; i <= n; i++ )
23        sum += pow( 3, gcd( i, n ) );
24    if( n % 2 == 0 )
25    {
26        sum += pow( 3, n / 2 ) * n / 2;
27        sum += pow( 3, n / 2 + 1 ) * n / 2;
28    }

29    else sum += pow( 3, n / 2 + 1 ) * n; 
30    return sum / n / 2;
31}

32
33 int  main( )
34 {
35    int n;
36    while( scanf("%d",&n) && n != -1 )
37    {
38        printf("%I64d\n",solve( n ));
39    }

40    return 0;
41}