跳到主要内容

CF1899D Yarik and Musical Notes

· 阅读需 2 分钟
lailai
学生 & 开发者

题意简述

求数列 aa 中有多少对 (ai,aj)(a_i,a_j)i<ji<j),设 x=ai,y=ajx=a_i,y=a_j,满足 (2x)(2y)=(2y)(2x)(2^x)^{(2^y)}=(2^y)^{(2^x)}

解题思路

Desmos 作出 (2x)(2y)=(2y)(2x)(2^x)^{(2^y)}=(2^y)^{(2^x)} 的图像:

不难发现只有 x=yx=yx=1,y=2x=1,y=2xyx\le y)时等式成立。

统计每个元素 ii 的出现次数 mim_i,然后对 (x,y)(x,y) 分类讨论:

  1. x=1,y=2x=1,y=2,选一个 11 和一个 22,方案数为 m1m2m_1m_2
  2. x=y=ix=y=i,在所有的 ii 中选两个,方案数为 Cmi2=mi(mi1)2C_{m_i}^2=\frac{m_i(m_i-1)}{2}

因此总方案数为:

m1m2+mi(mi1)2m_1m_2+\sum\frac{m_i(m_i-1)}{2}

参考代码

#include <bits/stdc++.h>
using namespace std;

using ll=long long;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
map<int,ll> m;
for(int i=1;i<=n;i++)
{
int t;
cin>>t;
m[t]++;
}
ll ans=m[1]*m[2];
for(auto [x,y]:m)ans+=y*(y-1)/2;
cout<<ans<<'\n';
}
return 0;
}