查询三元的等比数列,数据范围是2*1e5,想到应该是扫一遍就够了
其实就是找x/k和x/k/k 这些组合,所以想到用map来存
设计两个map,一个是用来存出现的个数,一个用来存,x和x/k这样组合的总个数,这样查找的时候就非常方便。

#include<iostream> #include<cstring> #include<cstdio> #include<map> #include<algorithm> #define ull unsigned long long using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=1e5+10; map<int,ll> m1,m2; int main(){ int n; int k; cin>>n>>k; int i; ll ans=0; for(i=1;i<=n;i++){ int x; scanf("%d",&x); if(x%k==0){ ans+=m2[x/k]; m2[x]+=m1[x/k]; } m1[x]++; } cout<<ans<<endl; }