polya的模板题
今天开始刷数论。。。。
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 + 1 ) / 2 );
}
return ans;
}
long long polya( double c, int n ){
long long ans = 0;
ans += turn( c, n );
ans += rota( c, n );
return ans / 2 / n;
}
int main(){
int c, n;
while( scanf( "%d%d", &c, &n ) && !( c == 0 && n == 0) ){
printf( "%lld\n", polya( c, n ) );
}
return 0;
}