题目链接
-
思路
对于成等比的三个数取中间的那个数,看看他左边有几个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;
}