xiu~
题目其实理解了就很简单。首先,数据提醒我们用O(n)来解决。画画样例发现,一个位数为n的数对位数>=n的数的影响是一定的。即使对<n的数的影响不定,数据最多只有10位,是允许枚举的。
详见代码。(有点冗长,不过理解就好)
#include<cstdio>
typedef long long ll;
const int mod = 998244353, N = 100002;
int n, t[11];
ll a[N][12], ans, tmp, pre[N], w;
int main() {
int tt;
scanf("%d", &n);
for(int i = 1; i <= n; i ++) {
scanf("%lld", &tt);
tmp = tt;
while(tmp) {
a[i][++ a[i][0]] = tmp % 10;
tmp /= 10;
}
t[a[i][0]] ++;
}
for(int i = 10; i >= 1; i --)
pre[i] = pre[i + 1] + t[i];
for(int i = 1; i <= n; i ++) {
for(int j = 1; j < a[i][0]; j ++) {
if(! t[j])
continue;
tmp = a[i][1];
w = 1;
for(int u = 2; u <= j + 1; u ++) {
w = (w * 100) % mod;
tmp = (tmp + a[i][u] * w) % mod;
}
for(int u = j + 2; u <= a[i][0]; u ++) {
w = ((w << 1) + (w << 3)) % mod;
tmp = (tmp + a[i][u] * w) % mod;
}
ans = (ans + tmp * t[j] % mod) % mod;
w = 10;
tmp = ((a[i][1] << 1) + (a[i][1] << 3)) % mod;
for(int u = 2; u <= j; u ++) {
w = (w * 100) % mod;
tmp = (tmp + a[i][u] * w) % mod;
}
for(int u = j + 1; u <= a[i][0]; u ++) {
w = ((w << 1) + (w << 3)) % mod;
tmp = (tmp + a[i][u] * w) % mod;
}
ans = (ans + tmp * t[j] % mod) % mod;
}
tmp = a[i][1];
w = 1;
for(int u = 2; u <= a[i][0]; u ++) {
w = (w * 100) % mod;
tmp = (tmp + a[i][u] * w) % mod;
}
ans = (ans + tmp * (pre[a[i][0]] - 1) % mod + tmp) % mod;
w = 10;
tmp = ((a[i][1] << 1) + (a[i][1] << 3)) % mod;
for(int u = 2; u <= a[i][0]; u ++) {
w = (w * 100) % mod;
tmp = (tmp + a[i][u] * w) % mod;
}
ans = (ans + tmp * (pre[a[i][0]] - 1) % mod + tmp) % mod;
}
printf("%lld\n", ans % mod);
return 0;
}
如有错误,请大佬在评论区指出。谢谢!