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).
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).
Print the number of pairs of indexes i, j (i < j) that ai + aj is a power of 2.
4 7 3 2 1
2
3 1 1 1
3
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.
题解:有一种位运算判断是不是2^n 的方法,但是在这里还是会超时,这里用二分。
方法如图,啊偶,怎么把和师父的聊天记录贴出来了?我什么都布吉岛~~~
,这个方法可以了解,感觉不错的
下面是二分的代码:
<span style="font-size:10px;">#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
#define CLR(a,b) memset(a,b,sizeof(a))
int main()
{
int n;
__int64 a[100010];
while(~scanf("%d",&n))
{
CLR(a,0);
__int64 num=0; //这里num用__int64不然会wa
for(int i=1;i<=n;i++)
scanf("%I64d",&a[i]);
sort(a+1,a+1+n); //排序
for(int i=1;i<=n;i++)
{
for(int j=1;j<=31;j++)
{
__int64 t=((__int64)1<<j)-a[i]; //t=2^n-a[i]再在剩余的数里找有没有是t的数
num+=upper_bound(a+1+i,a+1+n,t)-lower_bound(a+1+i,a+1+n,t);
} //大于t的开始的点的地址-大于等于t开始的点的地址,他们相差的数目,就是t的个数
}
printf("%I64d\n",num);
}
return 0;
}</span>