Codeforces Round #Pi (Div. 2) —— C-Geometric Progression

weixin_34088583發表於2017-05-28

題意:

如今有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
*/


相關文章