签到题。
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;
}