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; }