// 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,多费点空间,但是很值得。