Codeforces Round #675 (Div. 2) C - Bargain (推导)

    科技2022-08-13  101

    给你一串字符串,从里面删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; }
    Processed: 0.012, SQL: 8