闷声大暴力= =。
数据范围特别小,所以直接
O(n√)
搞出所有n的约数,然后一个个转进制慢慢判。
时间复杂度大概是
O(Tn√logmn)
。
或许可以加强一下。
2333333
#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
inline int rd() {
char c = getchar();
while (!isdigit(c)) c = getchar() ; int x = c - '0';
while (isdigit(c = getchar())) x = x * 10 + c - '0';
return x;
}
int n , m;
int _div[1000000] , cnt;
inline int sqr(int x) { return x * x ; }
void input() {
}
void print(int x , int m) {
int tmp[33] = {0} , t = 0;
if (!x) {
puts("0");
return;
}
while (x) {
tmp[++ t] = x % m;
x /= m;
}
per (i , t , 1) {
if (tmp[i] >= 10) putchar(tmp[i] - 10 + 'A');
else putchar(tmp[i] + '0');
}
puts("");
}
int calc(int x , int m) {
int ret = 0;
while (x) {
ret += sqr(x % m);
x /= m;
}
return ret;
}
void solve() {
cnt = 0;
int _n = (int) sqrt(n + 0.5);
rep (i , 1 , _n) if (n % i == 0) {
_div[++ cnt] = i;
if (i != n / i)
_div[++ cnt] = n / i;
}
int ans = 0;
rep (i , 1 , cnt)
ans += calc(_div[i] , m);
print(ans , m);
}
int main() {
#ifndef ONLINE_JUDGE
freopen("data.txt" , "r" , stdin);
#endif
while (scanf("%d%d" , &n , &m) == 2) {
input();
solve();
}
return 0;
}