Peking University Online Judge 1286 Necklace of Beads

テストケースに0を忍ばせるとかいうアレ
ポリアの数え上げ定理を使いましたが、反転のパートは想像で書きました(バカなの?)

#include<cstdio>
#include<vector>
using namespace std;
typedef long long int ll;

int n;
vector<ll> va;

int gcd(int a, int b){
	if(b == 0) return a;
	else return gcd(b, a % b);
}

int main(){
	for(int i = 0; i <= 24; i++){
		if(i == 0) va.push_back(1LL);
		else va.push_back(va.back() * 3LL);
	}
	for(;;){
		scanf("%d", &n);
		if(n == -1) break;
		if(n == 0){
			printf("0\n");
			continue;
		}
		ll res = 0;
		for(int i = 1; i <= n; i++){
			if(i == 1 || i == n){
				res += va[n / i];
			}else if(gcd(n, i) != 1){
				res += va[gcd(n, i)];
			}else{
				res += 3;
			}
		}
		for(int i = 1; i <= n; i++){
			if(n % 2 == 0){
				if(i % 2 == 0){
					res += va[n / 2];
				}else{
					res += va[(n - 2) / 2 + 2];
				}
			}else{
				res += va[(n - 1) / 2 + 1];
			}
		}
		printf("%lld\n", res / (ll)(n * 2));
	}
	return 0;
}