CF 567C. Geometric Progression

来源:互联网 发布:机械常最用有限元软件 编辑:程序博客网 时间:2024/05/21 14:39

题目链接


题意:

给出一个序列,求公比为k,且长度为3的子等比序列个数。(1 ≤ n, k ≤ 2e5)( - 1e9 ≤ ai ≤ 1e9)


解法:

dp[0][x]表示当前x的数量。
dp[1][x]表示当前以值x结尾,长度为2且公比为K的等比数列数量。


代码:

#include<cstring>#include<iostream>#include<map>using namespace std;#define for1(a, n) for (int (a) = 1; (a) <= (n); (a)++)#define mem(a,x)  memset(a,x,sizeof a)typedef long long ll;const int maxn=2e5+0.5    ;int n,K;map<int,ll >dp[2];int a[maxn+10];void solve(){    dp[0].clear();    dp[1].clear();    ll ans=0;    for1(i,n)    {        int x=a[i];        if(x%K==0)        {            ans+=dp[1][x/K];            dp[1][x]+=dp[0][x/K];        }        dp[0][x]++;    }    cout<<ans<<endl;}int main(){   std::ios::sync_with_stdio(false);   while(cin>>n>>K)   {       for1(i,n) cin>>a[i];       solve();   }   return 0;}
#include<cstring>#include<iostream>#include<map>using namespace std;#define for1(a, n) for (int (a) = 1; (a) <= (n); (a)++)#define mem(a,x)  memset(a,x,sizeof a)typedef long long ll;const int maxn=2e5+0.5    ;int n,K;map<int,int >mp;int cnt[maxn+10],a[maxn+10];ll dp[maxn+10];int ID(int x){    if(!mp.count(x))    {        int k=mp.size();        mp[x]=k;        return k;    }    return mp[x];}void solve(){    mp.clear();    mem(cnt,0);    mem(dp,0);    ll ans=0;    for1(i,n)    {        int x=a[i],y=ID(x);        if(x%K==0)        {            int t=ID(x/K);//这里不能直接用mp            ans+=dp[t];            dp[y]+=cnt[t];        }        cnt[y]++;    }    cout<<ans<<endl;}int main(){   std::ios::sync_with_stdio(false);   while(cin>>n>>K)   {       for1(i,n) cin>>a[i];       solve();   }   return 0;}
0 0
原创粉丝点击