对于成等比的三个数取中间的那个数,看看他左边有几个a[i]/k在看看右边有几个a[i]×k将数量相乘即可
代码
#include<iostream>
#include<unordered_map>
using namespace std;
const int N=2e5+10;
typedef long long LL;
LL a[N];
int s[N];
int s2[N];
int n,k;
int idx;
unordered_map<LL,LL> q;
inline int getnum(LL t) //离散化
{
if(!q.count(t))q[t]=++idx;
return q[t];
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
getnum(a[i]);
}
for(int i=1;i<=n;i++)
{
s[getnum(a[i])]++;
}
LL res=0;
for(int i=1;i<=n;i++)
{
long long cnt=0;
s2[getnum(a[i])]++;
if(i>1&&i<n&&a[i]%k==0)
{
if(q.count(a[i]*k))
{
cnt=s2[getnum(a[i]/k)];
if(k==1||a[i]==0)cnt--; //这种情况需要减去自身
cnt*=s[getnum(a[i]*k)]-s2[getnum(a[i]*k)]; //右边a[i]*k的个数等于全部的a[i]*k的个数减去1~i的a[i]*k的个数
res+=cnt;
}
}
}
cout<<res;
}