AT_abc353_c 题解

思路

题目中有一点对本题而言非常重要:mod=108,ai<108mod=10^8,a_i<10^8,所以 ai<moda_i<mod,这也就说明 ai+aj<2×moda_i+a_j<2\times mod。首先只有当 ai+ajmoda_i+a_j\ge mod 时,它才会被取模,此时 (ai+aj)modmod=ai+ajmod×1(a_i+a_j)\bmod mod=a_i+a_j-mod\times1;其余情况(ai+aj<moda_i+a_j<mod)时,它不会被取模。其中 ai+aja_i+a_j 是必须存在的,我们设 ss 是取模次数,则总和为 (ai)×(n1)s×mod(\sum a_i)\times(n-1)-s\times mod。其中 ss 的计算我们可以先给 aa 排序,然后枚举 aia_i,二分计算 ai+ajmod(i<jn)a_i+a_j\ge mod(i<j\le n) 的个数即可。当然,如果你和我一样想偷懒的话你可以在 ai+1ana_{i+1}\sim a_n 间 lower_bound,计算 modai\ge mod-a_i 的个数。

代码

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