Description
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.
Sample Input
Input
4 7 3 2 1
Output
2
Input
3 1 1 1
Output
3
题意:给出一堆数,任意选出两个,判断是否是2的幂次方,找出有多少对。
这题坑的其实就是直接枚举会超时,所以利用map映射(也就是2分)。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
map<long long,long long>Map;
int main()
{
int n;
long long temp,sum;
while(~scanf("%d",&n))
{
sum=0;
for(int i=0;i<n;i++)
{
scanf("%lld",&temp);
for(int j=0;j<32;j++)
sum+=Map[(2<<j)-temp];
Map[temp]++;
}
printf("%lld\n",sum);
}
return 0;
}