B. Powers of Two
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).
Input
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).
Output
Print the number of pairs of indexes i, j (i < j) that ai + aj is a power of 2.
Examples
input
4 7 3 2 1
output
2
input
3 1 1 1
output
3
解题思路:最开始想到的是利用N & (N - 1)是否为0判断一个数是否是2 ^ k,然后遍历整个数组(i从0到n - 1,j从i + 1到n)得到答案,时间复杂度为O(N ^ 2),很明显会TLE。仔细读题后发现,ai不会超过10 ^ 9,约等于2 ^ 30,所以我们可以先打出一张2 ^ k的表,然后对于ai,用2 ^ k减去ai,利用二分搜索得到aj的数量,累加即得结果。时间复杂度为O(N)。
代码如下:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn = 100005;
typedef long long ll;
int num[maxn];
ll power[33];
void get_power()
{
for(int i = 0;i < 33;i++)
power[i] = 1 << i;
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 0;i < n;i++){
scanf("%d",&num[i]);
}
get_power();
sort(num,num + n);
ll ans = 0;
for(int i = 0;i < n - 1;i++){
for(int j = 0;j < 33;j++){
ll temp = power[j] - num[i];
if(temp > 0)
ans += upper_bound(num + i + 1,num + n,temp) - lower_bound(num + i + 1,num + n,temp);
}
}
printf("%I64d\n",ans);
return 0;
}