题目大意:有一个长度为n的序列,让你从这之中找到长度为3(三个数)且能成公比为k的序列,问一共有多少组这样的序列。
解题思路:map即可搞定
注意点:公比为k的意思是除了这三个数之间有k倍的关系,但我没理解到他们本身也必须是k的倍数这一点~~
还有a【i】*k的时候会溢出,一定要打个long long符号才行;
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
using namespace std;
typedef long long LL;
const int maxn=2*100000+100;
int a[maxn];
int n,k;
map<LL,LL> s,s2;//s用于存储“当前的数”之前的某个数的个数,s2是它之后的某个数
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
s.clear();
s2.clear();
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
s2[a[i]]++;
}
LL ans=0;
for(int i=1; i<n; i++) //枚举中值
{
if(i==1)
{
s2[a[i]]--;
s[a[i]]++;
}
else
{
s2[a[i]]--;
if(a[i]%k==0)
{
ans+=(LL)s[a[i]/k]*(LL)s2[(LL)a[i]*k];
}
s[a[i]]++;
}
}
cout<<ans<<endl;
}
}