// 696K 0MS G++
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
char num[30002];
const int MAX = 62;
int charMap[130];
char intMap[63];
inline int getMathNumber(char digit) {
if (digit <= '9') {
return digit - '0';
} else if (digit <= 'Z') {
return digit - 'A' + 10;
} else {
return digit - 'a' + 10 + 26;
}
}
void init() {
int num = 0;
for (int i = '0'; i <= '9'; i++) {
charMap[i] = num;
num++;
}
for (int i = 'A'; i <= 'Z'; i++) {
charMap[i] = num;
num++;
}
for (int i = 'a'; i <= 'z'; i++) {
charMap[i] = num;
num++;
}
for (int i = 0; i <= 9; i++) {
intMap[i] = i + '0';
}
for (int i = 0; i < 26; i++) {
intMap[i+10] = 'A' + i;
}
for (int i = 0; i < 26; i++) {
intMap[i+36] = 'a' + i;
}
}
void solve(const char * num) {
int maxNumber = -1;
int digitsSum = 0;
// printf("%s %d\n", num, (int)strlen(num));
for (int i = 0; i < strlen(num); i++) {
// int val = getMathNumber(num[i]);
int val = charMap[num[i]];
// printf("%d\n", val);
maxNumber = maxNumber > val ? maxNumber: val;
digitsSum += val;
}
for (int Nbegin = maxNumber + 1; Nbegin <= MAX; Nbegin++) {
if(digitsSum%(Nbegin-1) == 0) {
printf("%d\n", Nbegin);
return;
}
}
printf("such number is impossible!\n");
}
int main() {
init();
while(scanf("%s", num) != EOF) {
solve(num);
}
}
discuss 一个很NB的推导:
设输入的是abcd,假设其解是n进制,则有
(a*n*n*n + b*n*n + c*n + d)%(n-1)=0
则有:( (a*n*n*n)%(n-1)+
(b*n*n)%(n-1)+
(c*n)%(n-1)+
d )%(n-1)=0
则有:( (a* (n%(n-1)) *(n%(n-1)) *(n%(n-1)))+
(b* (n%(n-1)) *(n%(n-1)))+
(c* (n%(n-1) +
d ) %(n-1)=0
则有: (a*1*1*1+b*1*1+c*1+d)%(n-1)=0
则有:(a+b+c+d)%(n-1)=0
所以,经过转换,变为求输入数的各数位的和能%(n-1)等于0;
我就知道一定有啥办法可以快捷的判断能否整除。
为了节省时间, 在把0~9A~Za~z转换成数字时,直接用了hashmap charMap,多费点空间,但是很值得。