CodeForces Powers of Two STL

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
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 <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <iomanip>
#include <math.h>
#include <map>
using namespace std;
#define FIN     freopen("input.txt","r",stdin);
#define INF     0x3f3f3f3f
#define lson    l,m,rt<<1
#define rson    m+1,r,rt<<1|1
typedef long long LL;

int a[100005];

int main()
{
    //FIN
    int n;
    LL ans;
    map<int,int> m;
    while(~scanf("%d",&n))
    {
        ans=0;
        for(int i=1; i<=n; i++)
            scanf("%d",&a[i]);
        m.clear();
        for(int i=1; i<=n; i++)
        {
            for(LL j=1; j<=2e9; j+=j)
            {
                ans+=m[j-a[i]];
            }
            m[a[i]]++;
        }
        cout<<ans<<endl;
        return 0;
    }

}

  

原文地址:https://www.cnblogs.com/Hyouka/p/5722123.html