RT,真的不知道错了,样例全过了,但1分都没有。
// P6686 混凝土数学
#include <cstdio>
#include <iostream>
#include <algorithm>
#define p 998244353
#define MN 500005
#define int long long
using namespace std;
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
return x * f;
}
int n, a[MN], b[MN], ans;
signed main() {
n = read();
for(int i = 0; i < n; i++) a[i] = read(), b[a[i]]++;
sort(a, a + n);
for(int i = 1; i < MN / 2; i++) b[i] += b[i - 1]; // 统计小于i边的数量
for(int l = 0, r = 0; r < n; l = r) {
for(; a[l] == a[r]; r++);
if(r - l > 1) ans += ((r - l) * (r - l - 1) / 2 % p) * (b[a[l] * 2 - 1] - b[a[l]] + b[a[l] - 1]) % p, ans %= p; // 能组成多少等腰三角形
if(r - l > 2) ans += ((((r - l) * (r - l - 1))) / 2 * (r - l - 2) / 3) % p, ans %= p; // 能组成多少等边三角形
}
printf("%lld", ans);
return 0;
}