A sequence a1,a2,…,an is called good if, for each element ai, there exists an element aj (i≠j) such that ai+aj is a power of two (that is, 2d for some non-negative integer d
).
For example, the following sequences are good:
- [5,3,11]
(for example, for a1=5 we can choose a2=3. Note that their sum is a power of two. Similarly, such an element can be found for a2 and a3
- ),
- [1,1,1,1023]
- ,
- [7,39,89,25,89]
- ,
- []
- .
Note that, by definition, an empty sequence (with a length of 0
) is good.
For example, the following sequences are not good:
- [16]
(for a1=16, it is impossible to find another element aj
- such that their sum is a power of two),
- [4,16]
- (for a1=4, it is impossible to find another element aj
- such that their sum is a power of two),
- [1,3,2,8,8,8]
- (for a3=2, it is impossible to find another element aj
- such that their sum is a power of two).
You are given a sequence a1,a2,…,an
. What is the minimum number of elements you need to remove to make it good? You can delete an arbitrary set of elements.
Input
The first line contains the integer n
(1≤n≤120000) — the length of the given sequence.
The second line contains the sequence of integers a1,a2,…,an
(1≤ai≤109).
Output
Print the minimum number of elements needed to be removed from the given sequence in order to make it good. It is possible that you need to delete all n
elements, make it empty, and thus get a good sequence.
Examples
Input
6 4 7 1 5 4 9
Output
1
Input
5 1 2 3 4 5
Output
2
Input
1 16
Output
1
Input
4 1 1 1 1023
Output
0
Note
In the first example, it is enough to delete one element a4=5
. The remaining elements form the sequence [4,7,1,4,9], which is good.
codeforces map
#include <iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
long long int p[50];
long long int a[200000];
map<int,int> m;
void init()
{
int i;
for(i=0; i<=30; i++) p[i]为2的i次方
p[i]=1<<i;
}
int main()
{
long long int n,i,j;
init();
scanf("%lld",&n);
for(i=0; i<=n-1; i++)
{
scanf("%lld",&a[i]);
m[a[i]]++;
}
long long int ge=0;
for(i=0; i<=n-1; i++)
{
for(j=0; j<=30; j++)
{
long long int t=p[j]-a[i];
if(t==a[i])
{
if(m[t]>=2)
break;
}
else
{
if(m[t])
break;
}
}
if(j==31)
ge++;
}
printf("%lld\n",ge);
return 0;
}