题意
3个颜色,n个珠子,旋转+翻转
思路
代码
#include <algorithm>
//#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const int INF = 0x7f7f7f7f;
const int maxn = 100 + 10;
ll Pow ( ll a, ll b ) {
ll ans;
for ( ans = 1; b; b >>= 1 ) {
if ( b & 1 )
ans *= a;
a *= a;
}
return ans;
}
ll gcd ( ll a, ll b ) { return b ? gcd ( b, a % b ) : a; }
ll polya ( ll c, ll n ) {
ll ans = 0;
for ( int i = 1; i <= n; ++i )
ans += Pow ( c, gcd ( n, i ) );
if ( n & 1 )
ans += n * Pow ( c, ( n + 1 ) / 2 );
else {
ans += ( n / 2 ) * Pow ( c, ( n + 2 ) / 2 );
ans += ( n / 2 ) * Pow ( c, n / 2 );
}
ans = ans / ( 2 * n );
return ans;
}
int main () {
#ifdef LOCAL
freopen ( "in", "r", stdin );
// freopen("out","w",stdout);
#endif
ll c, n;
c = 3;
while ( ~scanf ( "%lld", &n ) && n != -1 ) {
if ( n == 0 )
printf ( "0\n" );
else {
ll sol = polya ( c, n );
printf ( "%lld\n", sol );
}
}
return 0;
}