ARC34B
問題概要
正整数\(n\)に対し、\(n\)の十進表記における各桁の和を\(f(n)\)で表す。正整数\(N\)が与えられた時に、\(x+f(x)=N\)を満たす正整数\(x\)を全て求めよ。
制約
- \(1≤N≤\)1018
考えたこと
- Nの制約が 1018 ということもあり、\(O(N)\)のアルゴリズムではTLEしてしまう。
- \(f(x)\) は桁和であるため、\(f(x)\) の最大値を考えてみると、\(9 \times 17 < 200\) とわかる。
- そのため、\(N-200 <= x < N\)として\(f(x) = N-x\)というこの等式を満たす\(x\)の個数とその値を求めればよいという問題に帰着できる。
書いたコード
#include <bits/stdc++.h> using namespace std; long long f(long long x) { string X = to_string(x); long long sum = 0; for(int i = 0; i < X.size(); ++i) { sum += (long long)(X[i] - '0'); } return sum; } int main() { long long N; cin >> N; long long cnt = 0; vector<long long> v; for(long long x = N; x >= N - 200; x--) { if(f(x) == N-x) { cnt++; v.push_back(x); } } cout << cnt << endl; if(cnt != 0) { sort(v.begin(), v.end()); for(int i = 0; i < v.size(); ++i) { cout << v[i] << endl; } } return 0; }