题意
旋转+翻转
思路
组合数学第一题
代码
#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 b, ll e ) {
ll ans;
for ( ans = 1; e; e >>= 1 ) {
if ( e & 1 )
ans *= b;
b *= b;
}
return ans;
}
int gcd ( int a, int b ) { return b ? gcd ( b, a % b ) : a; }
int polya ( int c, int n ) {
int 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
int cor, len;
while ( ~scanf ( "%d%d", &cor, &len ) && ( cor || len ) ) {
int sol = polya ( cor, len );
printf ( "%d\n", sol );
}
return 0;
}