类似于树状数组求逆序对,用map来代替树状数组,rear维护的是后面n-i+1个数出现的次数,front维护的是前i-1个数出现的个数
然后再将公式转化一下
a_xk=a_y
a_yk=a_z
a_y*k=a_z
a_y/k=a_x
然后只要枚举一下a_y的前面有多少个a_x,以及a_y后面有多少个a_z然后两者相乘即可
C++ 代码
#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=1100000,mod=998244353;
typedef pair<int,int>pii;
int n,m,k;
int a[N];
int r[N],l[N];
void solve()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
map<int,int>front,rear;
for(int i=1;i<=n;i++)
front[a[i]]++;
for(int i=n;i;i--)
{
front[a[i]]--;
if(i!=1&&i!=n)
{
if(a[i]%k==0){
if(rear[a[i]*k]&&front[(a[i])/k])
r[i]+=rear[a[i]*k]*front[(a[i])/k];
}
}
rear[a[i]]++;
}
int res=0;
for(int i=1;i<=n;i++)
res+=r[i];
cout<<res<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
int t=1;//cin>>t;
while(t--)solve();
return 0;
}