Sam and substrings

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zjucor/article/details/82493452

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 的子串有 161, 6, 和为 23

样例输入 #01

123

样例输出 #01

164

样例解释 #01

123 的子串有:1231223123, 和为 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

猜你喜欢

转载自blog.csdn.net/zjucor/article/details/82493452
SAM