vector<uint64_t> read_bigint(const string &s){ vector<uint64_t> result; result.reserve((s.size() + 7) >> 3); auto it = s.rbegin(); size_t cnt = 0, val = 0; for (; it != s.rend(); ++it, ++cnt) { if (cnt == 8) result.emplace_back(val), cnt = val = 0; val += (*it - '0') * pow10[cnt]; } result.emplace_back(val); return result; }
vector<uint64_t> add(vector<uint64_t> a, uint32_t b){ a.empty() ? a.emplace_back(b) : a[0] += b; uint64_t carry = a[0] / pow10[8]; a[0] %= pow10[8]; for (size_t i = 1; carry; ++i) { if (i == a.size()) a.emplace_back(0); a[i] += carry, carry = a[i] / pow10[8], a[i] %= pow10[8]; } return a; }
vector<uint64_t> mul(vector<uint64_t> a, uint32_t b){ if (a.empty()) return a; uint64_t carry = 0; for (size_t i = 0; i < a.size() || carry; ++i) { if (i == a.size()) a.emplace_back(0); uint64_t cur = (i < a.size() ? a[i] : (uint64_t)0) * b + carry; a[i] = cur % pow10[8], carry = cur / pow10[8]; } return a; }
uint64_tS(const vector<uint64_t> &a){ uint64_t result = 0; for (size_t i = 0; i < a.size(); ++i) for (uint64_t cur = a[i]; cur; cur /= 10) result += cur % 10; return result; }
intmain(){ cin.tie(nullptr)->sync_with_stdio(false); string s; cin >> s; auto nums = read_bigint(s); uint64_t L = 0, R = s.length(); while (L < R) { uint64_t k = L + ((R - L) >> 1); S(mul(add(nums, k), 9)) <= 9 * k ? R = k : L = k + 1; } cout << L << '\n'; return0; }