You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
#include <bits/stdc++.h>
|
|
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
const int INF = 0x3f3f3f3f;
|
|
|
|
|
int n, r;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//0-15之间的数字转为16进制的数字
|
|
|
|
|
char int_to_char(int a) {
|
|
|
|
|
return a <= 9 ? '0' + a : a - 10 + 'A';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//单个字母转换成数字
|
|
|
|
|
int char_to_int(char a) {
|
|
|
|
|
//用句人话描述就是:
|
|
|
|
|
//(1)如果是0到9之间的,就返回a-'0'
|
|
|
|
|
//(2)如果是A-F之间的,就返回10+a-'A'
|
|
|
|
|
return '0' <= a && a <= '9' ? a - '0' : 10 + a - 'A';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//深度优先搜索
|
|
|
|
|
void dfs(int x, string path, int sum) {
|
|
|
|
|
if (sum == n) {
|
|
|
|
|
cout << path << endl;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
for (int i = 0; i < -r; i++)
|
|
|
|
|
dfs(x - 1, path + int_to_char(i), sum + i * pow(r, x - 1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
|
cin >> n >> r;
|
|
|
|
|
//求i位-r进制的每一位位数上的极大值和极小值
|
|
|
|
|
int x, Max = -INF, Min = INF;
|
|
|
|
|
int sum = 0;
|
|
|
|
|
for (x = 1;; x++) {
|
|
|
|
|
//因为r为负数,那么-r代表对应的正数,比如-16进制,那么-r代表16,16-1代表15,也就是说,这个数位的最大上限是15,就是F
|
|
|
|
|
sum += (-r - 1) * pow(r, x - 1);
|
|
|
|
|
if (sum < Min) Min = sum;
|
|
|
|
|
if (sum > Max) Max = sum;
|
|
|
|
|
if (n >= Min && n <= Max) break;
|
|
|
|
|
}
|
|
|
|
|
//深搜
|
|
|
|
|
dfs(x, "", 0);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|