题解:AT_abc353_d [ABC353D] Another Sigma Problem

Idea

首先要跑出每一个数的位数。

接下来,我们枚举两个数中后面的数。但是我们不需要枚举前面的数。

考虑对于 aka_kaka_k 位数为 cnticnt_iii 的贡献:

a1×cntk+ak+a2×cntk+ak++ak1×cntk+ak+ak+1×cntk+ak++an1×cntk+ak+an×cntk+aka_1\times cnt_k+a_k+a_2\times cnt_k+a_k+\cdots+a_{k-1}\times cnt_k+a_k+a_{k+1}\times cnt_k+a_k+\cdots+a_{n-1}\times cnt_k+a_k+a_n\times cnt_k+a_k

(a1+a2++ak1+ak+1++an1+an)×cntk+ak×(n1)(a_1+a_2+\cdots+a_{k-1}+a_{k+1}+\cdots+a_{n-1}+a_{n})\times cnt_k+a_k\times (n-1)

(i=1naiak)×cntk+ak×(n1)(\sum_{i=1}^{n}a_i-a_k)\times cnt_k+a_k\times (n-1)

不难发现,转变为以上式子即可 O(n)\operatorname{O}(n) 求解了。

Tips

  • 虽然本题答案要求模 998244353998244353,但是还是要开 long long
  • 需要边计算边取模,否则会爆 long long

Code

#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
int sum[200005];
int n;
int a[200005],wei[200005];
int getwei(int x){
	int cnt=0;
	while(x){
		x/=10;
		cnt++;
	}
	return cnt;
}
long long ans=0,ten[11]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000};
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		wei[i]=getwei(a[i]);
		sum[i]=sum[i-1]+a[i];
	}
	for(int i=1;i<=n;i++)sum[i]%=998244353;
	for(int i=1;i<=10;i++)ten[i]%=998244353;
	for(int i=1;i<=n;i++){
		ans+=sum[i-1]*ten[wei[i]];
		ans+=(i-1)*a[i];
		ans%=998244353;
	}
	cout<<ans%998244353;
	return 0;
}
posted @   Weslie_qwq  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示