思路用个map存出线过的数然后用是1<<n的数去减,看这个数在mp里存不存在,注意如果和自身相等 需要看是不是出现次数大于1
1<<N 的n的范围要计算一波,起码是30才满足数据范围
#include<bits/stdc++.h>
using namespace std;
int a[120005];
int main(){
int n;
while(scanf("%d",&n)==1){
map<int,int>q;
int cnt=0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
q[a[i]]++;
}
for(int i=0;i<n;i++){
int ok=0;
for(int p=0;p<=30;p++){
int t=(1<<p)-a[i];
if(q[t]){
if(t==a[i]&&q[t]==1){
continue;
}
ok=1;
break;
}
}
if(!ok)cnt++;
}
printf("%d\n",cnt);
}
return 0;
}