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;
}