1905. 数位和

签到题。

f 的最大值当且仅当 x 的每个数位都是 9。故一次 f 运算后,f(x) 最大为 9n=9\times10^5。所以本题不需要使用高精度。

由此可知,经过很少次数的 f 运算后,f^k(x) 必然收敛为个位数,且个位数满足 f(x)=x,所以当发现 f(x) 为个位数时,马上 break 即可。

复杂度为 O(n)

#include <bits/stdc++.h> using namespace std; using ll = long long; const ll mn = 1e5 + 10; ll n, k, x; char x0[mn]; signed main() { cin.tie(0)->ios::sync_with_stdio(false); cin >> n >> k >> (x0 + 1); --k; for (ll i = 1; i <= n; ++i) { x += x0[i] - '0'; } for (ll i = 1, v; i <= k; ++i) { if (x < 10) { break; } v = x, x = 0; for (; v; v /= 10) { x += v % 10; } } cout << x << '\n'; return 0; }