Project Euler 725
Project Euler 725
题目
Digit sum numbers
A number where one digit is the sum of the other digits is called a digit sum number or DS-number for short. For example, $352, 3003$ and $32812$ are DS-numbers.
We define $S(n)$ to be the sum of all DS-numbers of $n$ digits or less.
You are given $S(3) = 63270$ and $S(7) = 85499991450$.
Find $S(2020)$. Give your answer modulo $10^{16}$.
解决方案
令$N=2020.$一个数如果是DS数,那么它的数位和是最大数位的$2$倍。这不难想到使用动态规划来做。
本题的动态规划过程考虑使用“我为人人”的方法,因为本质上都是对当前状态的所有数都添加一个新的数位$d$,从而到达下一个状态。
令状态$c(i,t,m)(1\le i\le N,0\le t\le18,0\le m\le9)$表示当前有多少个$i$位有前导0的数,其中数位之和为$t$,并且这$i$个数位中最大数位为$m.$
不难知道,对于初值$i=1,0\le j\le 9$,都有$c(i,j,j)=1.$
考虑对$c(i,t,m)$中的所有数后面都拼接一个新的数位$0\le d\le 9$,那么可以进行转移:
$c(i,t,m)\rightarrow c(i+1,t+d,\max(m,d))$
添加一个数位$d$后,那么数位和就变成了$t+d$,最大数位也变成了$\max(m,d).$
令状态$s(i,t,m)(1\le i\le N,0\le t\le18,0\le m\le9)$表示$i$位有前导0并满足以下条件的所有数之和:数位之和为$t$,并且这$i$个数位中最大数位为$m.$
同样不难知道,对于初值$i=1,0\le j\le 9$,都有$s(i,j,j)=j.$
考虑对$s(i,t,m)$中的所有数后面都拼接一个新的数位$0\le d\le 9$,那么可以进行转移:
$10s(i,t,m)+d\cdot c(i,t,m)\rightarrow s(i+1,t+d,\max(m,d))$
添加一个数位$d$后,相当于将$s(i,t,m)$中的所有数都乘$10$,并且每一个数都多了一个数位$d$,一共有$c(i,t,m)$个。
那么,题目最终所需要求的答案为:
代码
1 |
|