1331:Multiply
keyword
n進表記 C++
概要
数字を表す文字列がa,b, cが与えられたときa*b==cが成り立つのは基数(10^6以下)をいくつにすればよいか求める問題。
基数変換はO(log n)でできるので愚直に実装すれば間に合う。基数の下限には注意しておくこと。
inline ll changeBase(ll a, int base){ ll ret = 0; ll d = 1, bb = 1; while(a/d){ ret += ((a/d)%10)*bb; d *= 10; bb *= base; } return ret; } int main(){ ll p, q, r, d; int rept, base, st; scanf("%d",&rept); LOOP(rept){ scanf("%lld%lld%lld",&p,&q,&r); st = 1; d = 1; while(p/d){ st = max(st,(int)((p/d)%10)); d *= 10; } d = 1; while(q/d){ st = max(st,(int)((q/d)%10)); d *= 10; } d = 1; while(r/d){ st = max(st,(int)((r/d)%10)); d *= 10; } for(base=st+1;base<=16;base++)if(changeBase(p,base)*changeBase(q,base)==changeBase(r,base))break; if(base>16) base=0; printf("%d\n",base); } return 0; }