Codeforces Round #675 (Div. 2).C. Bargain

Codeforces Round #675 (Div. 2).C. Bargain

题意:
给你一个字符串,你可以删除其中的字串,然后统计剩下的值的和。
思路:
枚举每一位的贡献。
对于这道题,每一位的贡献是由前面部分和后面部分组成的,对于对于第i位,如果选前面的串,一共由(1,2,3...i-1)选法,一共是
(i-1)×i÷2×ai×权重。
对于后面的串来讲,它的贡献可以这样想,如果只去掉一位,那它的权重就小10倍,去掉一位一共有n-i种选法,也就是(n-i)×ai×权重。依次类推,如果去掉2位,权重小100倍,一共有n-i-1种选法,以此类推,后面的为
avatar
这个可以通过循环算出来
代码如下

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6;
const int mod=1e9+7;
char s[N];
int main()
{
    cin>>s+1;
    int len=strlen(s+1);
    ll sum=0;
    ll ans=0;
    ll pw=1;
    for(ll i=len;i>=1;i--)
    {
        ll num=(i-1)*i/2;
        ll cur=(num*(s[i]-'0')%mod*pw%mod);//算前面的贡献
        ans%=mod;
        ans=(ans+cur)%mod;
        cur=(sum*(s[i]-'0')%mod);//后面的贡献
        ans=(ans+cur)%mod;
        sum+=(len-i+1)*pw;//跟新sum
        sum%=mod;
        pw*=10;//跟新权值
        pw%=mod;
    }
    ans%=mod;
    cout<<ans<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/Aracne/p/14060336.html