题目链接
思路:这个题看上去很复杂,其实可以考虑看看每个a【i】对答案的贡献,对于a【i】的每一个数字占答案的贡献我们是可以求出来的。比如说是123,123和长度为1、2、3.。。。10(所有数字长度肯定不超过10)相比,123的每一个数字的位置都是固定的,123和45比的话,3不是在5的前面就是在5的后面,我们可以通过这种方式把a【i】与每种长度的数字比较的贡献算出来,说出来有点绕,还是看代码吧。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=998244353;
const int maxn=1e5+1;
ll p[32],a[maxn],cnt[12],ans;
int main()
{
int n;
p[0]=1;
for(int i=1;i<=30;++i) p[i]=(p[i-1]*10)%mod;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%lld",&a[i]);
cnt[to_string(a[i]).size()]++;
}
for(int i=1;i<=n;++i)
{
string s=to_string(a[i]);
for(int j=1;j<=10;++j)//与各个长度的数相比
{
ll sum=0;
for(int k=s.size()-1,now=0,flag=j;k>=0;--k,++now)//数在前面
{
if(flag) now++,flag--;
sum+=p[now]*(s[k]-'0');
}
for(int k=s.size()-1,now=0,flag=j;k>=0;--k,++now)//数在后面
{
sum+=p[now]*(s[k]-'0');
if(flag) now++,flag--;
}
ans=(ans+(sum*cnt[j])%mod)%mod;
}
}
printf("%lld\n",ans);
}