CF567C Geometric Progression (思维)

查询三元的等比数列,数据范围是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;
}
View Code
原文地址:https://www.cnblogs.com/ctyakwf/p/12612989.html