https://atcoder.jp/contests/iroha2019-day1/tasks/iroha2019_day1_h
解説
https://atcoder.jp/contests/iroha2019-day1/submissions/5195896
基本方針は19999や299のように、
- なるべく桁数を少なくするために9でまとめる
- 余りは先頭に置く
として作っていけばいい。
ただ、X≠Nという条件があるので、X=Nとなった場合にはうまく回避する必要がある。
基本的には199999であれば、2899999のように最上位の桁にその下を桁から1つ分持ってくればいい。
全部9であれば、繰り上がりで999→1899のようにするし、
一桁の場合もうまく場合分けすることでACできる。
ll N; //--------------------------------------------------------------------------------------------------- void _main() { cin >> N; ll bak = N; int sm = 0; while (0 < N) { sm += N % 10; N /= 10; } string ans = ""; while (0 < sm) { if (9 <= sm) ans = to_string(9) + ans, sm -= 9; else ans = to_string(sm) + ans, sm = 0; } if (to_string(bak) == ans) { if (ans[0] == '9') { ans = "18" + ans.substr(1); } else { if (ans.size() == 1) { ans[0]--; ans = "1" + ans; } else { ans[0]++; ans[1]--; } } } cout << ans << endl; }