AT_abc353_d 题解

思路

首先我们设 sis_iaia_i 的位数,则 f(ai,aj)=ai×10sj+ajf(a_i,a_j)=a_i\times10^{s_j}+a_j。首先先看放在地位的情况,aia_i 会被放在低位 i1i-1 次,所以低位之和就是 i=1n(ai×(i1))\sum\limits_{i=1}^n(a_i\times(i-1))。然后再看高位,aia_i 会被放在高位 nin-i 次,这 nin-i 次之和就是 ai×(j=i+1n10sj)a_i\times(\sum\limits_{j=i+1}^n10^{s_j}),其中后面部分可以倒着枚举时一边枚举一边处理。总答案就是 i=1n(ai×(i1))+i=1n(ai×(j=i+1n10sj))\sum\limits_{i=1}^n(a_i\times(i-1))+\sum\limits_{i=1}^n(a_i\times(\sum\limits_{j=i+1}^n10^{s_j}))

代码

# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
const ll mod = 998244353;
int n, a[200005];
ll sum, ans, tmp;
int main () {
	ios::sync_with_stdio (0);
	cin.tie (0);
	cout.tie (0);
	cin >> n;
	for (int i = 1; i <= n; ++ i)
		cin >> a[i], ans += a[i] * (i - 1ll), ans %= mod;
	for (int i = n; i; -- i) {
		ans += sum * a[i], ans %= mod;
		tmp = 1;
		while (a[i])
			a[i] /= 10, tmp *= 10;
		sum += tmp, sum %= mod;
	}
	cout << ans;
	return 0;
}
posted @ 2024-05-16 19:38  Vitamin_B  阅读(6)  评论(0)    收藏  举报  来源