Codeforces 149 B. Martian Clock

問題

時刻がa:bの形で与えられる。
aは0以上23以下の整数で、bは0以上59以下の整数であるが、
何進数で書かれているかはわからない。


何進数で書かれているか、ありえる基数(2以上の整数)を全て、小さい順に出力せよ。
無限に多くの基数で可能な場合は-1を出力、
可能な基数が無い場合は0を出力せよ。

制約条件

a,bは5文字以下
a,bは0-9またはA-Zからなる文字列


方針

2以上の基数を全部試す。
その基数よりも大きい数字があったら、その基数は不可能。


99進法でも100進法でも大丈夫だったら、答えは無限なので、-1を出力する。

ソースコード

ll ck(string x,int b){
	ll res=0;
	rep(i,x.size()){
		int d=isdigit(x[i])?x[i]-'0':x[i]-'A'+10;
		if(d>=b)return -1;
		res*=b; res+=d;
	}
	return res;
}
void run()
{
	string in, a, b;
	cin>>in;
	int p=in.find(":");
	a=in.substr(0,p); b=in.substr(p+1);
	bool infi=0, any=0;
	if(ck(a,100)==ck(a,99)&&ck(b,100)==ck(b,99))infi=1;
	for(int i=2;i<=70;i++){
		if(0<=ck(a,i)&&ck(a,i)<=23&&0<=ck(b,i)&&ck(b,i)<=59){
			if(infi){
				cout<<-1<<endl;
				return;
			}
			if(any)cout<<" ";
			cout<<i;
			any=1;
		}
	}
	if(!any)cout<<0;
	cout<<endl;
}