转换条件:lowbit(a[i]+a[j])==a[i]+a[j] 转换为 a[i]+a[j]=2^k,
第一个for按顺序枚举a[i],然后第二个for枚举k的所有情况,两层循环中找a[j](即a[i]-2^k)的个数即可
代码展示:
#include<bits/stdc++.h>
#define int long long
using namespace std;int a[100010];
unordered_map<int,int> h;signed main()
{int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];int res=0;for(int i=1;i<=n;i++){for(int k=1;k<=30;k++)//枚举所有可能的k{int aj=(1<<k)-a[i];//aj为能与a[i]配对的数if(h.find(aj)!=h.end())res+=h[aj];//能找到aj}h[a[i]]++;}cout<<res;return 0;
}