直接做肯定不好弄,考虑把每一位拆开算贡献。
首先第 i 位的贡献取决于它的右边有多少个数没有被删掉。对于 i,如果删掉的数都是左面的,那么贡献就是 2(i−1)×i×10n−i,这个可以直接算。
如果删掉的数是右面的,需要考虑删去了多少个数的情况,假如当前数的贡献是 10k,就一共有 k+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; }
|