| 比赛 |
NOIP2025模拟赛3 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
Good Triplets |
最终得分 |
100 |
| 用户昵称 |
淮淮清子 |
运行时间 |
1.239 s |
| 代码语言 |
C++ |
内存使用 |
31.99 MiB |
| 提交时间 |
2025-11-26 11:48:35 |
显示代码纯文本
#include<iostream>
using namespace std;
const int MAXN = 1e6 + 5;
typedef long long ll;
ll sum[MAXN << 1], two[MAXN << 1], a[MAXN];
ll n, c, ans = 0;
inline ll C(ll x){
return x * (x - 1) / 2;
}
int main(){
freopen("Triplets.in", "r", stdin);
freopen("Triplets.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> c;
for(ll i = 0;i < n;i ++){
ll x; cin >> x; a[x] ++;
}
sum[0] = a[0 % c]; two[0] = C(a[0 % c]);
for(ll i = 1;i < (c << 1);i ++){
sum[i] = sum[i - 1] + a[i % c];
two[i] = two[i - 1] + C(a[i % c]);
}
ll m = c / 2;
bool flag = (c & 1);
for(ll i = 0;i < c;i ++){
if(!a[i]) continue;
ans += a[i] * (sum[i + m - (flag ? 0 : 1)] - sum[i]) * (sum[i + c - 1] - sum[i + m]);
}
for(ll i = 0; i < c; i++){
if(!a[i]) continue;
ans -= a[i] * (C(sum[i + m] - sum[i]) - (two[i + m] - two[i]));
}
cout << ans / 3 << '\n';
return 0;
}