给你一串字符串,从里面删1~n长度的子串之后,剩下的可能得数字的和。 比如107,删1,0,7,10,07,107之后剩07,17,10,7,1,0(空串)
枚举每个字符,考虑这一位留下来对答案的总贡献 该位的贡献可分为:删除的区间在该位之前的贡献和删除的区间在该位之后的贡献
#define int ll
const int mod
=1e9+7;
int f
[MX
];
void init(int n
)
{
f
[0]=0,f
[1]=1;
ll tag
=10;
for(int i
=2;i
<=n
;++i
)
f
[i
]=(f
[i
-1]+i
*tag
%mod
)%mod
,tag
=tag
*10%mod
;
}
void solve()
{
string s
;cin
>>s
;
reverse(all(s
));
int n
=s
.size()-1;
init(n
);
ll ans
=0,tag
=1;
rep(i
,s
.size())
{
int d
=s
[i
]-'0';
ll tmp1
=(n
-i
)*(n
-i
+1)/2%mod
*tag
%mod
*d
%mod
;
tmp1
%=mod
;
ll tmp2
= d
*f
[i
]%mod
;
ans
=((ans
+tmp1
)%mod
+tmp2
)%mod
;
tag
=tag
*10%mod
;
}
cout
<<ans
<<endl
;
}