【前后缀分解】首先题目要求 x < y < z,所以这里是和顺序有关的,如果以第一个数 a[x] 为基准,那么后面 a[x] / k 和 a[x] / (k * k) 的顺序是不一定的,同理以最后一个数为基准也是。所以只能以中间的数 a[y] 为基准,然后统计这个数前面的 a[y] / k 的个数和后面的 a[y] * k 的个数,然后利用乘法原理乘起来。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 200010;
ll arr[N];
unordered_map<ll, ll> pre, rear;
int main() {
ll n, k, ans = 0;
cin >> n >> k;
for (int i = 0; i < n; i++) {
cin >> arr[i];
rear[arr[i]]++;
}
for (int i = 0; i < n; i++) {
rear[arr[i]]--;
if (arr[i] % k == 0) {
ans += pre[arr[i] / k] * rear[arr[i] * k];
}
pre[arr[i]]++;
}
cout << ans << endl;
return 0;
}