題意
給你組序列,你可以随意找出一個a[i] 和 一個a[j] 讓 a[i] + a[j]是2的次方,問你有幾個 a[i] 不滿足這個條件
思路
當時想的是無腦暴力一發,結果沒有逾時wa12,然後莫名放空自己,卡了一個小時 。。。到最後才發現,2的幂有30個 ,我寫的是 <30 應該寫成 <= 30 。。難受 ,思路就是 我先打一個2次幂的表,之後把我的a[i] 放到map裡,之後對于每一個a[i],我們和表裡的每一個數相減,看看得到的數是不是在map裡,就好了,需要注意的是 如果相減得到的數和我們的a[i]相等的話,我們要數map裡的數字要有兩個以上才行。
代碼:
#include <bits/stdc++.h>
using namespace std;
const int maxn = + ;
int a[maxn];
int p[maxn];
vector<int>V;
map<int,int>M;
int cnt = ;
void init()
{
for(int i = ; i<= ; i++) p[i] = <<i;
}
int main()
{
int n;
scanf("%d",&n);
init();
M.clear();
for(int i = ; i < n ; i++)
{
scanf("%d",&a[i]);
if(!M.count(a[i]))
{
M[a[i]] = ;
}
else
{
M[a[i]] ++;
}
}
int ans = ;
for(int i = ; i < n ; i++)
{
int j;
for(j = ; j <= ; j++)
{
int t = p[j] - a[i];
if(t == a[i])
{
if(M[t]>=)
{
break;
}
}
else
{
if(M[t])
{
break;
}
}
}
if(j == )
{
ans++;
}
}
cout<<ans<<endl;
}