思路:我们可以处理一个后缀来记录当前数a[i]需要乘上多少(类似于1110这样的),然后对于当前位来说,对答案的贡献还要加上(i - 1) * a[i],因为a[i]还要做前(i - 1)个数的后缀。
代码:
cpp
#include <bits/stdc++.h>
#define INF 1000000000
#define LINF 1000000000000000000
#define MOD 1000000007
#define mod 998244353
#define F first
#define S second
#define ll long long
#define N 200010
using namespace std;
ll n,a[N],sz[N],tot[20],pw[N];
int main(){
ll i,j;
pw[0]=1;
for(i=1;i<N;i++)
{
pw[i]=(pw[i-1]*10)%mod;
}
scanf("%lld",&n);
for(i=0;i<n;i++)
{
scanf("%lld",&a[i]);
ll x=a[i];
while(x)
{
sz[i]++;
x/=10;
}
}
ll ans=0;
for(i=n-1;i>=0;i--)
{
ll val=i;
for(j=0;j<=10;j++)
{
val=(val+tot[j]*pw[j])%mod;
}
ans=(ans+(a[i]%mod)*val)%mod;
tot[sz[i]]++;
}
printf("%lld\n",ans);
return 0;
}