C - Geometric Progression CodeForces - 567C

  第一次写的构造题

  给了一个长度为n的序列和一个k,要求找以k为公比的长度为3的等比数列的个数。

  这题做法就是枚举中值a[i],然后开一个mp1维护中值前的a[i]/k这个数的个数,再开一个mp2维护中值后的a[i]*k这个数的个数,2者相乘即是等比数列的个数。

感觉这题有毒,这题我a数组开小了不re却tle

#include<stdio.h>
#include<map>
using namespace std;
typedef long long ll;
map<ll,int>mp1;//用mp1统计中值前面的数的个数
map<ll,int>mp2;//统计中值后面的个数
int main()
{
    ll k,a[200005];
    int n;
    ll ans=0;
    scanf("%d%I64d",&n,&k);
    for(int i=1;i<=n;i++)
    {
        scanf("%I64d",&a[i]);
        mp2[a[i]]++;
    }
    mp1[a[1]]++;//预处理,因为从a[2]开始枚举,所以中值前的a[1]的数量++;
    mp2[a[1]]--;
    for(int i=2;i<n;i++)
    {
        mp2[a[i]]--;//这步很关键,因为a[i]是中值,所以中值后面a[I]的个数要减1
        if(a[i]%k==0)如果如果a【i】能被k整除,说明以A[I]为中项的等比数列是存在的;
        {
            ans+=(ll)mp1[a[i]/k]*(ll)mp2[a[i]*k];
        }
        mp1[a[i]]++;
    }
   printf("%I64d\n",ans);
    return 0;

}

 

posted @ 2018-08-02 16:42  eason99  阅读(79)  评论(0编辑  收藏  举报