ルイビンスク海でCodeforces1195D2-潜水艦(ハード版)

質問の意味は非常に簡単です。

それは、ほとんどの$ 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 }
View Code

おすすめ

転載: www.cnblogs.com/Jack-Oran/p/11208503.html