You are given n integers a1, a2, ..., an. Find the number of pairs of indexes i, j (i < j) that ai + aj is a power of 2 (i. e. some integer xexists so that ai + aj = 2x).
The first line contains the single positive integer n (1 ≤ n ≤ 105) — the number of integers.
The second line contains n positive integers a1, a2, ..., an (1 ≤ ai ≤ 109).
Print the number of pairs of indexes i, j (i < j) that ai + aj is a power of 2.
4 7 3 2 1
2
3 1 1 1
3
In the first example the following pairs of indexes include in answer: (1, 4) and (2, 4).
In the second example all pairs of indexes (i, j) (where i < j) include in answer.
思路:由于Ai + Aj = 2 ^ x , 则有 2 ^ x - Ai = Aj ,即二分查找即可。
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n;
__int64 a[100010];
while(~scanf("%d",&n))
{
for(int i = 1 ; i <= n ; i++)
scanf("%I64d",&a[i]);
sort(a+1,a+1+n);
__int64 ans = 0;
for(int i = 1 ; i <= n ; i++)
{
for(int j = 1 ; j <= 31 ; j++)
{
__int64 t = ((__int64) 1 << j) - a[i];
ans += upper_bound(a+1+i,a+n+1,t) - lower_bound(a+1+i,a+1+n,t);
}
}
printf("%I64d\n",ans);
}
return 0;
}