当前位置: 代码迷 >> 综合 >> Codeforces Round #Pi (Div. 2) Geometric Progression
  详细解决方案

Codeforces Round #Pi (Div. 2) Geometric Progression

热度:71   发布时间:2023-12-05 11:25:01.0

题目链接

  • 思路

对于成等比的三个数取中间的那个数,看看他左边有几个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;
}
  相关解决方案