题解:CF1899D Yarik and Musical Notes
概述给定数列 a,统计满足 2 的 x 次方的 2 的 y 次方次幂等于 2 的 y 次方的 2 的 x 次方次幂的下标对数,其中 x、y 取自两个元素。分析该等式仅在 x 等于 y,或 x、y 为 1 和 2 时成立。统计每个值的出现次数,选一个 1 与一个 2 的方案数为二者次数之积,相等值任取两个的方案数为组合数,两部分相加即为答案。
求数列 a 中有多少对 (ai,aj)(i<j),设 x=ai,y=aj,满足 (2x)(2y)=(2y)(2x)。
作出 (2x)(2y)=(2y)(2x) 的图像:

不难发现只有 x=y 或 x=1,y=2(x≤y)时等式成立。
统计每个元素 i 的出现次数 mi,然后对 (x,y) 分类讨论:
- x=1,y=2,选一个 1 和一个 2,方案数为 m1m2;
- x=y=i,在所有的 i 中选两个,方案数为 Cmi2=2mi(mi−1)。
因此总方案数为:
m1m2+∑2mi(mi−1)
#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;
}