# 1498. Number of Subsequences That Satisfy the Given Sum Condition
###### tags: `Leetcode` `FaceBook` `Medium` `Binary Search` `Two Sum`
## 思路 $O(NlogN)$ $O(N)$
Binary search
先排序,然后对于每一个值,以它为起点(minimum value),binary search找maximum value
由于这里要计算2的n次方,很有可能会overflow,所以需要先把可能的结果用一个dp array存下来,这样才能在计算的过程中就算mod
这里解释一下为什么是```result+powerDP[start-1-idx]``` 因为$powerDP[i]$ 里面包含的是一共i+1个数,一定包含第一个数,也就是只能决定后i个数要不要 一共有几种可能,而我们要算排列组合的阵列是从idx到start-1,所以要写成那样
## Code
```java=
class Solution {
public int numSubseq(int[] nums, int target) {
int result = 0;
Arrays.sort(nums);
int idx = 0;
int[] powerDP = new int[nums.length];
powerDP[0] = 1;
int mod = 1000000007;
for(int i = 1;i < nums.length;i++){
powerDP[i] = (powerDP[i-1]*2)%mod;
}
while(idx < nums.length){
int smaller = nums[idx];
int start = idx;
int end = nums.length;
if(smaller*2>target) break;
while(start<end){
int mid = start+(end-start)/2;
if(nums[mid]<=target-smaller){
start = mid+1;
}
else{
end = mid;
}
}
result = (result+powerDP[start-1-idx])%mod;
idx++;
}
return result;
}
}
```