https://www.hackerrank.com/challenges/sam-and-substrings/problem
fSamantha 和 Sam 正在玩一个游戏。他们面前有 ‘N’ 个球,每一个从 0 到 9 编号,但是第一个球不会为 0. Samantha 计算了这些球构成的字符串的所有子串。对每一个子串,如果子串为S,Sam 必须向一个初始为空的盒子里边放 S 块糖。Sam 必须知道最终盒子里边有多少糖,如果他能正确的回答,那么他就能得到所有的糖果。Sam 不能掌握这些数学的东西,所以他需要你的帮忙。
输入格式
用一个字符串代表这些球上边的数字。
输出格式
用一个整数代表游戏结束的时候盒子里有多少糖。将结果 % (109+7)。
数据范围
1 ≤ N ≤ 2*105
样例输入 #00
16
样例输出 #00
23
样例解释 #00
16
的子串有 16
,1
, 6
, 和为 23。
样例输入 #01
123
样例输出 #01
164
样例解释 #01
123
的子串有:1
, 2
, 3
, 12
, 23
, 123
, 和为 164。
一开始想每位每位单独算,但是因为数据比较大,TLE
def substrings(n):
mod=10**9+7
res=0
l=len(str(n))
for i,s in enumerate(str(n)[::-1]):
# res+=int(s)*(2**(l-1-i))
for j in range(0,i+1):
res+=int(s)*(10**j)*(l-i)
res%=mod
# print(res)
return res
正解是DP,因为是substring,dp[i]表示已i结尾的substring累加和,然后转移方程
dp[i+1]=10*dp[i]+i*s[i]+s[i]
def substrings(n):
mod=10**9+7
l=len(str(n))
dp=[0]*l
s=str(n)
dp[0]=int(s[0])
for i in range(1,l):
dp[i]=dp[i-1]*10+i*int(s[i])+int(s[i])
dp[i]%=mod
return sum(dp)%mod