直接做肯定不好弄,考虑把每一位拆开算贡献。

首先第 ii 位的贡献取决于它的右边有多少个数没有被删掉。对于 ii,如果删掉的数都是左面的,那么贡献就是 (i1)×i2×10ni\displaystyle\frac{(i - 1) \times i}{2} \times 10^{n - i},这个可以直接算。

如果删掉的数是右面的,需要考虑删去了多少个数的情况,假如当前数的贡献是 10k10^k,就一共有 k+1k + 1 种删除办法,可以倒着循环一次然后累加。

于是这题就做完了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 1e9 + 7;
signed main()
{
string s;
cin >> s;
int n = s.length();
s = ' ' + s;
vector<int> pre(n + 1, 0);
pre[0] = 1;
for (int i = 1; i <= n; i++) {
pre[i] = (pre[i - 1] * 10) % mod;
}
int ans = 0;
for (int i = 1; i <= n; i++) {
ans = (ans + ((i * (i - 1) / 2) % mod * pre[n - i]) % mod * (s[i] - '0')) % mod;
}
int cnt = 0;
for (int i = n; i >= 1; i--) {
ans = (ans + cnt * (s[i] - '0')) % mod;
cnt = (cnt + (n - i + 1) * pre[n - i]) % mod;
}
cout << ans;
return 0;
}