题意:
求两个数加起来是2的次方,这样的数对在数列中有多少组
题解:
爆搜直接over,做出来都有鬼,比较坑的是自己YY的log发生了莫名的错误,卡在第一组很久,颇为尴尬,正解是map,键值是数值,实值是该键值在数列中对应的个数,遍历直到2的32次方然后记录即可
for(int i =1;i<32;i++){
ans+= mp[(1<<i)-x];
}
mp[x]++;
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>
#define pr(x) cout<<#x<<" "<<x;
#define pl(x) cout<<#x<<" "<<x<<endl;
#include<math.h>
#include<algorithm>
#include<set>
#include<map>
#include <queue>
#include<string>
#include<cmath>
using namespace std;
map <int ,int > mp;
int main(){
int n;
scanf("%d",&n);
int num[100005];
long long ans = 0;
for(int i = 0;i<n;i++){
int x;scanf("%d",&x);
for(int i =1;i<32;i++){
ans+= mp[(1<<i)-x];
}
mp[x]++;
}
printf("%I64d",ans);
}