Codeforces 394(#231 Div1) B. Very Beautiful Number
問題
p桁の数で、Leading zeroがなく、下一桁を一番上にもってくると元の数のx倍になるような数最小の数を求めよ。
そのような数がないときはImpossibleと答えよ。
制約条件
1≦p≦10^6
1≦x≦9
方針
元の数の1の位を全通り試す。
a[0] * xの1の位は、ずらした数の1の位である。これは元の数の10の位なので、
a[1] = a[0] * x % 10である。
これを繰り返していけば、a[p - 1]までが求まる。
あとはつじつまが合っているかと、leading zeroになってないかを見て、
最小の数を答えればいい。
ソースコード
int p, x, a[1000100]; int main(){ cin >> p >> x; string ans(1, '9' + 1); for(int d = 1; d < 10; d++){ int c = 0; a[0] = d; rep(i, p - 1){ a[i + 1] = (a[i] * x + c) % 10; c = (a[i] * x + c) / 10; } if(a[p - 1] == 0 || a[p - 1] * x + c != d) continue; string s; rep(i, p) s += a[p - 1 - i] + '0'; ans = min(ans, s); } cout << (isdigit(ans[0]) ? ans : "Impossible") << endl; return 0; }