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 Python (3.4.3) (judge verdict: Time Limit Exceeded)

from collections import Counter
from itertools import combinations

def solve(N, As):
    data = {}
    for i, a in enumerate(As):
        data.setdefault(a, []).append(i)
    d_pairs = []
    counters = Counter()
    keys = list(sorted(data.keys()))
    for v in combinations(keys, 2):
        if bin(v[0] + v[1]).count("1") == 1:
            d_pairs.append((v[0], v[1]))
            counters.update([v[0]] * len(data[v[0]]))
            counters.update([v[1]] * len(data[v[1]]))
    for v in keys:
        if bin(v * 2).count("1") == 1:
            d_pairs.append((v, v))
            counters.update([v] * len(data[v]))
    cost = []
    for p in d_pairs:
        if p[0] != p[1]:
            c1 = counters[p[0]] if bin(p[0]).count("1") != 1 else 10 ** 10
            c2 = counters[p[1]] if bin(p[1]).count("1") != 1 else 10 ** 10
            cost.append((c1 + c2, p[0], p[1]))
        else:
            cost.append((10 ** 10 * 2 + 1, p[0], p[1]))
    ans = 0
    cost.sort()
    for cost_pair in sorted(cost):
        if cost_pair[1] != cost_pair[2]:
            while len(data[cost_pair[1]]) > 0 and len(data[cost_pair[2]]) > 0:
                ans += 1
                data[cost_pair[1]].pop()
                data[cost_pair[2]].pop()
        else:
            while len(data[cost_pair[1]]) > 1:
                ans += 1
                data[cost_pair[1]].pop()
                data[cost_pair[2]].pop()
    return ans

if __name__ == "__main__":
    N = input()
    As = [int(c) for c in input().split()]
    print(solve(N, As))