每次反转区间,得到一个数字,然后问你把所有这样不重复的反转之后的数字加起来,结果是多少。
输入数据
2 12 3 012 10 0123456789
输出数据
45 369 733424314
第三组数据打表得:
1+45 1 1 1 1 1 1 1 1 1
1 2+37 2 2 2 2 2 2 2 1
1 2 3+31 3 3 3 3 3 2 1
1 2 3 4+27 4 4 4 3 2 1
1 2 3 4 5+25 5 4 3 2 1
1 2 3 4 5 5+25 4 3 2 1
1 2 3 4 4 4 4+27 3 2 1
1 2 3 3 3 3 3 3+31 2 1
1 2 2 2 2 2 2 2 2+37 1
1 1 1 1 1 1 1 1 1 1+45
用前缀和求解:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl "\n"
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
void init()//打表
{
int n;
cin >> n;
string s;
cin >> s;
s = " " + s;
int a[100][1000] = {0};
for (int i = 1; i <= n; i++)
{
for (int j = i; j <= n; j++)
{
string s1 = s;
reverse(s1.begin() + i, s1.begin() + j + 1);
for (int k = 1; k <= n; k++)
{
a[k][(s1[k] - '0')]++;
}
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 0; j < 9; j++)
{
cout << a[i][j] << " ";
}
cout << '\n';
}
}
void solve()
{
ll n;
string s;
while (cin >> n)
{
cin >> s;
s = " " + s;
vector<ll> sum(N), a(n + 2);
for (int i = 1; i <= n; i++)
{
sum[i] = (sum[i - 1] + (s[i] - '0')) % mod;
}
ll len = (1 + n) * n / 2, cnt = 0, pr = 0;
for (int i = 1; i <= (n + 1) / 2; i++)
{
cnt = (cnt + ((n - i + 1) - (i - 1)));
pr = (pr + (sum[(n - i + 1)] - sum[(i - 1)] + mod) % mod) % mod;
a[i] = (((s[i] - '0') * ((len - cnt) % mod) % mod) + pr) % mod;
a[n - i + 1] = (((s[n - i + 1] - '0') * ((len - cnt) % mod) % mod) + pr) % mod;
}
ll ans = 0;
for (int i = 1; i <= n; i++)
{
ans = ((ans * 10) % mod + a[i]) % mod;
}
cout << ans % mod << '\n';
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t = 1;
// init();
// cin >> t;
while (t--)
{
solve();
}
}