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# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Math;

class P
{
    static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        uint[] a = Console.ReadLine().Split().Select(uint.Parse).OrderByDescending(x => x).ToArray();
        //2べき、-1をすると1...1 -2で1...0
        //考えうるパターンとしては1が11か00、11の場合は2は0
        //下で分類してマッチング?
        //考えられうるそれに対して辺を張る
        //辺を張ってマッチング?
        //valid(n,a) && valid(n,b)でa>bであればbにまだ何かが存在しているかも
        int res = 0;
        Dictionary<uint, Queue<int>> dict = a.Distinct().ToDictionary(x => x, _ => new Queue<int>());
        for (int i = 0; i < a.Length; i++)
        {
            dict[a[i]].Enqueue(i);
        }

        bool[] used = new bool[a.Length];
        for (int i = 0; i < a.Length; i++)
        {
            if (used[i]) continue;
            var item = a[i];
            uint j = 1u << Log2(item);

            if (dict.ContainsKey(j - item))
            {
                if (dict[j - item].Count == 0) continue;
                var value = dict[j - item].Dequeue();
                if (value == i)
                {
                    var temp = value;
                    if (dict[j - item].Count == 0)
                    {
                        dict[j - item].Enqueue(temp);
                        continue;
                    }
                    else
                    {
                        value = dict[j - item].Dequeue();
                        dict[j - item].Enqueue(temp);
                    }
                }
                if (used[value]) continue;
                used[i] = true;
                used[value] = true;
                res++;
            }
            
            end:;
        }
        Console.WriteLine(res);
    }

    public static readonly int[] MultiplyDeBruijnBitPosition = { 1, 10, 2, 11, 14, 22, 3, 30, 12, 15, 17, 19, 23, 26, 4, 31, 9, 13, 21, 29, 16, 18, 25, 8, 20, 28, 24, 7, 27, 6, 5, 32 };
    public static int Log2(uint n)
    {
        n |= (n >> 1);
        n |= (n >> 2);
        n |= (n >> 4);
        n |= (n >> 8);
        n |= (n >> 16);
        return MultiplyDeBruijnBitPosition[(n * 0x07c4acddu) >> 27];
    }
}

class State
{
    string seq;
    int[] remain;
    public State(string seq, int[] remain)
    {
        this.seq = seq;
        this.remain = remain.ToArray();
    }
}