传送门:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1235
题解:算法竞赛训练指南p147
LRJ关于这个题还说有更简单的办法,用程序直接求置换的?求大牛路过的话请指点,万分感激!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
LL pow1[100];
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int n,t;
while(~scanf("%d%d",&n,&t)&&n)
{
pow1[0]=1;
for(int i=1;i<=n;i++)pow1[i]=pow1[i-1]*t;
LL a=0;
for(int i=0;i<n;i++)a+=pow1[gcd(i,n)];
LL b=0;
if(n&1)b=n*pow1[(n+1)/2];
else b=n/2*(pow1[n/2+1]+pow1[n/2]);
printf("%lld %lld\n",a/n,(a+b)/2/n);
}
return 0;
}