/****************
polya计数
分奇偶,再加上分旋转翻转
********************/
#include <iostream>
#include <cstdio>
using namespace std;
long long n,t;
long long pow(long long a,long long b){
long long res = 1;
while(b){
if(b&1) res *= a;
b >>= 1;
a *= a;
}
return res;
}
long long gcd(long long a,long long b){
if(b == 0) return a;
return gcd(b,a%b);
}
long long solve1(){
long long res = 0;
for(int i=1;i<=n;i++){
res += pow(t,gcd(i,n));
}
return res;
}
long long solve2(){
if(n&1) return ( solve1() + n*pow(t,(n+1)/2) ) / (2*n);
else return ( solve1() + (n/2)*pow(t,n/2) + (n/2)*pow(t,n/2+1)) / (2*n);
}
int main(){
while(cin >> n >> t){
printf("%lld %lld\n",solve1()/n,solve2());
}
return 0;
}
uva 10294 Polya计数
最新推荐文章于 2020-07-19 12:22:15 发布