题解:P14337 [JOI2020 预选赛 R2] 求和 / Digit Sum
题解:P14337 [JOI2020 预选赛 R2] 求和 / Digit Sum
题意:
求有多少个数,进行若干次变换后,能变为
规则:每次加上这个数的数位和。
思路:
由于规律促使小的数变大,永远不会变小,不难发现计算顺序是从小到大的递推。这是动态规划的板子题。
我们可以直接从 calc(i) 表示
需要注意的是
代码:
#include<bits/stdc++.h>
using namespace std;
int n,f[1000050];
inline int calc(int x){ //计算数位和
int res = 0;
while(x){
res+=(x%10);
x/=10;
}
return res;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i = 1;i <= n;++i){
f[i]++; //注意自己也可以转移到自己
f[i+calc(i)]+=f[i];
}
cout<<f[n];
return 0;
}