专栏文章

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

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

文章操作

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

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

前置

题意

有一个整数 N(1N106)N(1\le N\le10^6),求有多少个大于 11、小于 NN 的数经过多次操作后变为 NN
操作为:将当前所持整数用十进制表示,将其各位数字之和加到该整数上。

思路

这是一道很好的动态规划题。
我们定义 fif_i 记为当前有 fif_i 个大于 11、小于 ii 的数经过多次操作后变为 ii
然后就是状态转移。
假设这个这个数的个位数字之和记为 g(x)g(x),那么更新过后的数字就会变为 x+g(x)x+g(x)
那么我们可以基本定下来:
fx+g(x)fx+g(x)+fx+1f_{x+g(x)}\rightarrow f_{x+g(x)}+f_x+1
可能就有人问:“为什么要加一”?
答:因为本身(就是原数字)也可以。
答案最后别忘了加一(因为自身 NN 也可以)。

Code

CPP
void solve(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int t=i,sum=i;
		while(t) sum+=t%10,t/=10;
    	f[sum]+=f[i]+1;
	}
	cout<<f[n]+1;
	return;
}

评论

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

正在加载评论...