题意:
给出一个序列,求公比为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;
}