CodeForces 702B Powers of Two(二分)

来源:互联网 发布:身份证核查软件 编辑:程序博客网 时间:2024/05/16 19:57

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
47 3 2 1
output
2
input
31 1 1
output
3
题目大意:给出一个数字序列,求出ai + aj等于2的幂的数有多少组。

解题思路:最开始想到的是利用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;}


0 0