CodeForces 702B Powers of Two(二分)
来源:互联网 发布:身份证核查软件 编辑:程序博客网 时间:2024/05/16 19:57
B. Powers of Two
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
解题思路:最开始想到的是利用N & (N - 1)是否为0判断一个数是否是2 ^ k,然后遍历整个数组(i从0到n - 1,j从i + 1到n)得到答案,时间复杂度为O(N ^ 2),很明显会TLE。仔细读题后发现,ai不会超过10 ^ 9,约等于2 ^ 30,所以我们可以先打出一张2 ^ k的表,然后对于ai,用2 ^ k减去ai,利用二分搜索得到aj的数量,累加即得结果。时间复杂度为O(N)。
代码如下:
#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>using namespace std;const int maxn = 100005;typedef long long ll;int num[maxn];ll power[33];void get_power(){ for(int i = 0;i < 33;i++) power[i] = 1 << i;}int main(){ int n; scanf("%d",&n); for(int i = 0;i < n;i++){ scanf("%d",&num[i]); } get_power(); sort(num,num + n); ll ans = 0; for(int i = 0;i < n - 1;i++){ for(int j = 0;j < 33;j++){ ll temp = power[j] - num[i]; if(temp > 0) ans += upper_bound(num + i + 1,num + n,temp) - lower_bound(num + i + 1,num + n,temp); } } printf("%I64d\n",ans); return 0;}
0 0
- Codeforces 702 B. Powers of Two(二分)
- CodeForces 702B Powers of Two(二分)
- 【CodeForces】702B - Powers of Two(二分)
- 【Codeforces】-702B-Powers of Two(二分)
- coderforces 702B - Powers of Two(二分)
- Codeforces 702B - Powers of Two
- codeforces-702B-Powers of Two
- CodeForces 702B Powers of Two
- Codeforces 702B. Powers of Two
- codeforces 702B - Powers of Two
- CodeForces 702B: Powers of Two(遍历、穷举)
- Educational Codeforces Round 15 B. Powers of Two (数学)
- Educational Codeforces Round 15 B. Powers of Two
- Educational Codeforces Round 15, problem: (B) Powers of Two
- Educational Codeforces Round 15 B Powers of Two
- codeforces-Powers of Two(map的应用)
- hihocoder#1410 : Powers of Two(水题)
- Libgdx powers of two
- hdu 2068 RPG的错排 (错排公式)
- DS18B20温度传感器 - arduino
- java 容器
- POJ 1125 Stockbroker Grapevine floyd多源最短路,选取一个点,使最大边的权值是最小的
- E - Farthest Nodes in a Tree
- CodeForces 702B Powers of Two(二分)
- hd 4514 湫湫系列故事——设计风景线(并查集+最长直径)
- ROS中launch文件最简单示例
- Opencv感兴趣区域复制,画点,画线方法总结
- 【Java】字符串常量池和intern()方法的理解
- IOS中类和对象还有,nil/Nil/NULL的区别
- Java对象的浅拷贝与深拷贝
- poj 1845 求A^B的约数之和
- Java语言的基本类型的类型转换