题意很简单。
可以看出,每一个数最多只有 10 10 10位。而只要位数相同,数字不同的话对另一个数没有影响。
对于每一个数 x x x,考虑其为函数的前一个数时对答案造成的影响,枚举函数的后一个数的位数 y y y,按题意计算贡献,放入 a [ x ] [ y ] a[x][y] a[x][y]中。
同理,若 x x x是函数的后一个数,可计算出贡献放入 b [ x ] [ y ] b[x][y] b[x][y]中。
再用一个 s u m [ i ] sum[i] sum[i]数组表示位数为 i i i的数有几个。
最后再枚举每一个数 i i i和位数 j j j, a n s + = ( a [ i ] [ j ] + b [ i ] [ j ] ) ∗ s u m [ j ] ans+=(a[i][j]+b[i][j])*sum[j] ans+=(a[i][j]+b[i][j])∗sum[j]
Code:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,mod=998244353;
int n;
long long a[N][10],b[N][10],sum[N];
long long power(int k)
{
long long ans=1;
for(int i=1;i<=k;i++)ans=(ans*10)%mod;
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
long long k1=0,k2=0;int t=0;
for(int j=1;j<=10;j++)
{
long long p=x%10;
x/=10;
if(!x&&!t)t=j;
k1=(k1+p*power(j*2-2))%mod;
a[i][j]=(k1+x*power(j*2));
k2=(k2+p*power(j*2-1))%mod;
b[i][j]=(k2+x*power(j*2));
}
sum[t]++;
}
long long ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=10;j++)
ans=(ans+(a[i][j]+b[i][j])*sum[j])%mod;
printf("%lld\n",ans);
return 0;
}