思路:我们可以处理一个后缀来记录当前数a[i]需要乘上多少(类似于1110这样的),然后对于当前位来说,对答案的贡献还要加上(i - 1) * a[i],因为a[i]还要做前(i - 1)个数的后缀。
代码:
#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;
}