C. Summarize to the Power of Two
time limit per test
3 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
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:
(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
Note that, by definition, an empty sequence (with a length of 0
) is good.
For example, the following sequences are not good:
(for a1=16, it is impossible to find another element aj
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
InputCopy
6 4 7 1 5 4 9Output
Copy
1Input
Copy
5 1 2 3 4 5Output
Copy
2Input
Copy
1 16Output
Copy
1Input
Copy
4 1 1 1 1023Output
Copy
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.AC代码:
#include
#include
#define mod 1000000007
const int INF = 0x3f3f3f3f;
typedef long long ll;
const int maxn = 120050;
using namespace std;
int n;
int biao[31] = {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824};
map mp;
bool judge(int num)
{
for(int i = 0; i < 31; i++)
{
if(num == biao[i])
return true;
}
return false;
}
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
int temp;
scanf("%d", &temp);
mp[temp]++;
}
int ans = 0;
for(auto i : mp)
{
int t = i.first;
bool flag = false;
for(int j = 0; j <31; j++)
{
if(biao[j]-t == t)
{
if(mp.count(t) && mp[t] > 1)
{
flag = true;
break;
}
}
else if(mp.count(biao[j]-t))
{
flag = true;
break;
}
}
if(!flag)
ans += i.second;
}
printf("%d\n", ans);
return 0;
}