質問の意味は非常に簡単です。
それは、ほとんどの$ 10 $でのビット数のそれぞれを見ることができます。そして限り、同じビット数として、言葉の異なる番号が別の番号には影響しません。
関数の前に起因する時間数に対する答えに与える影響を考慮し、すべての数の$のx $、のために、問題の意味の寄与を計算するために応じて$ yを$の列挙機能のビット数は、[X] $置きます[Y]で$。
$ X $は対数関数である場合も同様に、$ Bに寄与を計算における[X] [Y] $。
$ Iはいくつかの$の数を表すビットの数のように$和[i]は$配列。
最後に、すべての数やビット$ I $ $ J $、$ ANS + =([I] [J] + B [i]の[J])*合計[J] $を列挙
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+5,mod=998244353; 4 int n; 5 long long a[N][10],b[N][10],sum[N]; 6 long long power(int k) 7 { 8 long long ans=1; 9 for(int i=1;i<=k;i++)ans=(ans*10)%mod; 10 return ans; 11 } 12 int main() 13 { 14 scanf("%d",&n); 15 for(int i=1;i<=n;i++) 16 { 17 int x; 18 scanf("%d",&x); 19 long long k1=0,k2=0;int t=0; 20 for(int j=1;j<=10;j++) 21 { 22 long long p=x%10; 23 x/=10; 24 if(!x&&!t)t=j; 25 k1=(k1+p*power(j*2-2))%mod; 26 a[i][j]=(k1+x*power(j*2)); 27 k2=(k2+p*power(j*2-1))%mod; 28 b[i][j]=(k2+x*power(j*2)); 29 } 30 sum[t]++; 31 } 32 long long ans=0; 33 for(int i=1;i<=n;i++) 34 for(int j=1;j<=10;j++) 35 ans=(ans+(a[i][j]+b[i][j])*sum[j])%mod; 36 printf("%lld\n",ans); 37 return 0; 38 }