题目描述
给定一个长度为n的正整数序列a[i],计算出有多少个i<j的数对,a[i]+a[j]为二的次幂,也就是说存在一个正整数x满足a[i]+a[j]==2^x。
输入
输入文件A.in。
第一行一个整数n。
第二行n个整数,其中第i个整数为a[i]。
输出
输出文件A.out。
一行一个整数表示数对的数量。
样例输入
1 | 4 |
样例输出
1 | 2 |
【样例输入2】
1 | 3 |
【样例输出2】
1 | 3 |
【数据范围】
对于 20% 数据 $ n \le 10^3 $
对于 50% 数据 $ n \le 5 \times 10^4 , 0 \le a_i \le 10^9 $
对于 100% 数据 $ n \le 10^6 , 0 \le a_i \le 10^9 $
这个题之前想枚举二的整次幂,然后二分查找判断来着….
于是代码长这样:
1 |
|
显然这个做法会T到飞起!
那么我就想怎么消 $ log $ 然后旁边的 $wqy \: 大\: 佬\: \& zs \: 大\: 佬$ 告诉我可以用双指针来优化,做到消除 $ log $
然后我冥思苦想,终于和 $DYJ$ 在一番激烈争论后确定了这题的双指针怎么搞,于是就AC了
具体思路也不怎么难,大体就是先排一遍序,然后枚举二的整次幂,双指针扫区间,统计答案
扫区间的时候,不断地根据单调性移动指针就好了
要特判一坨一样的值,因为扫到一坨一样的值是可以直接 $\Theta(1)$ 算出来的,完全不必要去扫
于是,代码长这样:
1 |
|