codeforces#314C&567C Geometric Progression

来源:互联网 发布:mud游戏编程 下载 编辑:程序博客网 时间:2024/05/03 12:48

题目大意:有一个长度为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;    }}


1 0
原创粉丝点击