題意:
如今有n個數,然後給出一個數k(代表的是等比數列中的那個公比),然後第二行給出n個數,代表的是這個序列。
最後的問題是叫你找出在這個序列中滿足公比為k的三個數有幾種。並輸出方案總數。
思路:
這道題非常巧妙啊,用到了map。
首先我們先記錄下每種數出現過了幾次。這裡由於數太大了。直接用陣列存會爆掉,所以改用map。
我們須要兩個map,分別記為mp1。mp2.
然後在for的過程中。我們是以當前的那個數為第二項,然後去尋找它的mp1[a[i]*k](也就是第三項)。尋找它的mp2[a[i]/k](也就是第一項)。
這裡為什麼先找第一項,然後第二,三項呢?用樣例來說吧:1 1 1; 由於假設我們找了第一項。那麼最後的結果為2(也就是1出現過的次數)。所以這樣的解法是不正確的。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<stack>
using namespace std;
#define me rng_58
#define maxn 200011
typedef __int64 ll;
ll a[maxn];
map<ll,ll> mp1,mp2;
int main(){
int n,k;
ll sum=0;
scanf("%d%d",&n,&k);
mp1.clear();
mp2.clear();
for(int i=1;i<=n;i++){
scanf("%I64d",&a[i]);
mp1[a[i]]++;
}
//以a[i]為中間項;
//mp1記錄的是a[i]後面有幾個。mp2記錄a[i]前面有幾個;
for(int i=1;i<=n;i++){
mp1[a[i]]--;
if(a[i]%k==0) //!
sum+=mp1[a[i]*k]*mp2[a[i]/k];
mp2[a[i]]++;
}
printf("%I64d\n",sum);
}
/*
4 1
3 3 3 3
*/