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种选法,以此类推,后面的为
这个可以通过循环算出来
代码如下
#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;
}