专栏文章

题解:P14337 [JOI2020 预选赛 R2] 求和 / Digit Sum

P14337题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mingj1nw
此快照首次捕获于
2025/12/02 02:02
3 个月前
此快照最后确认于
2025/12/02 02:02
3 个月前
查看原文

题解:P14337 [JOI2020 预选赛 R2] 求和 / Digit Sum

题意:


求有多少个数,进行若干次变换后,能变为 nn
规则:每次加上这个数的数位和。

思路:


由于规律促使小的数变大,永远不会变小,不难发现计算顺序是从小到大的递推。这是动态规划的板子题。
我们可以直接从 f[i]f[i] 推到 f[i+calc(i)]f[i+calc(i)] ,其中 calc(i) 表示 ii 的数位和。
需要注意的是 f[i]f[i] 初始值为 11 ,因为 ii 可以自己转移到 ii

代码:


CPP
#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;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...