CodeForces 702B - Powers of Two(二分)

http://codeforces.com/problemset/problem/702/B

题目链接

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 x exists 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
Note

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

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int n,i;
int a[100005];
int b[100000];
int main()
{
    while(cin>>n)
    {
        if(n==1){cout<<0<<endl;return 0;}
        for(i=0;i<n;i++)
        {
            cin>>a[i];
        }
        sort(a,a+n);
        b[0]=1;
        for(int i=1;i<32;i++)
        {
            b[i]=b[i-1]*2;//将每个2的方记下来
        }
        long long dd=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<32;j++)
            {
            int d=b[j]-a[i];
            if(d<=0)continue;
            int tt=lower_bound(a+i+1,a+n,d)-a;//找出这个数出现的第一个位置
            int gg=upper_bound(a+i+1,a+n,d)-a;//找出这个数出现的最后一个位置的后一个位置
            if(tt==n)
            continue;
            int mm=gg-tt;//这样就找到了几组
            dd+=mm;
            }
        }
        cout<<dd<<endl;
    }
    return 0;
}

            
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页