Problem:
Score : 600 points

Problem Statement

Takahashi has N balls with positive integers written on them. The integer written on the i-th ball is A_i.
He would like to form some number of pairs such that the sum of the integers written on each pair of balls is a power of 2.
Note that a ball cannot belong to multiple pairs.
Find the maximum possible number of pairs that can be formed.

Here, a positive integer is said to be a power of 2 when it can be written as 2^t using some non-negative integer t.

Constraints

1 \leq N \leq 2\times 10^5

1 \leq A_i \leq 10^9

A_i is an integer.

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 ... A_N

Output

Print the maximum possible number of pairs such that the sum of the integers written on each pair of balls is a power of 2.

Sample Input 1

3
1 2 3

Sample Output 1

1

We can form one pair whose sum of the written numbers is 4 by pairing the first and third balls.
Note that we cannot pair the second ball with itself.

Sample Input 2

5
3 11 14 5 13

Sample Output 2

2

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

/********************************************
 *Author*        :ZZZZone
 *Created Time*  : 六 12/15 20:16:34 2018
 * Ended  Time*  : 六 12/15 20:34:22 2018
*********************************************/

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <stack>
using namespace std;
#define debug(x) std::cerr << #x << " = " << (x) << std::endl
typedef pair<int, int> PII;
typedef long long LL;
typedef unsigned long long ULL;

inline void OPEN(string s){
	freopen((s + ".in").c_str(), "r", stdin);
	freopen((s + ".out").c_str(), "w", stdout);
}

const int MAXN = 2e5;
deque<LL> que[3];
vector<LL> a;
int n, ans;

int main()
{
	scanf("%d", &n);
	for(int i = 1; i <= n; i++){
		LL x; scanf("%lld", &x);
		a.push_back(x);
	}
	sort(a.begin(), a.end());
	for(int i = 0; i < a.size(); i++) que[1].push_back(a[i]);
	for(int k = 31; k >= 0; k--){
		LL ned = (1LL << k);
		int now = (k & 1);
		LL x = 0, y = 0;
		while(!que[now].empty()){
			if(x == 0){
				x = que[now].front();
				que[now].pop_front();
			}
			if(y == 0){
				if(que[now].empty()){
					que[!now].push_back(x);
					x = 0;
					break;
				}
				y = que[now].back();
				que[now].pop_back();
			}
			if(x + y == ned){
				ans++;
				x = y = 0;
			}
			else if(x + y < ned){
				que[!now].push_back(x);
				x = 0;
			}
			else if(x + y > ned){
				que[2].push_back(y);
				y = 0;
			}
		}
		if(x != 0) que[!now].push_back(x);
		if(y != 0) que[2].push_back(y);
		while(!que[2].empty()){
			que[!now].push_back(que[2].front());
			que[2].pop_front();
		}
	}
	printf("%d\n", ans);
    return 0;
}