coderforces 702B - Powers of Two(二分)

来源:互联网 发布:域名注册的流程是什么 编辑:程序博客网 时间:2024/05/16 14:33
B. Powers of Two
time limit per test
3 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

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
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.

思路:由于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;}


0 0
原创粉丝点击