TAG
- 芝士水题、算法 − 【双指针、快速幂】 芝士水题、算法 - 【双指针、快速幂】 芝士水题、算法−【双指针、快速幂】时间复杂度
- O ( N ∗ log N ) O(N \ast \log N) O(N∗logN)
//
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MOD = 1e9 + 7;
const int N = 1e5 + 6;
int in[N];
int fp(int a, int n) {
int ans = 1;
while (n) {
if (n & 1) ans = ans * a %MOD;
a = a * a % MOD;
n >>= 1;
}
return ans;
}
void solve() {
int n, k;
scanf("%lld%lld", &n, &k);
for (int i = 1; i <= n; i++) scanf("%lld", &in[i]);
sort(in + 1, in + n + 1);
int i = 1, j = n, ans = 0;
while (i <= j) {
if (in[i] + in[j] <= k) {
// 以 i 为起点、j 为终点的序列,有 2 ^ (j - i) 种方案
// 其中 len = j - i + 1,起点 i 是固定的,所以二进制方案数要 -1
ans = (ans + fp(2, j - i)) % MOD;
i++;
} else {
j--;
}
}
printf("%lld\n", ans);
}
signed main() {
int t = 1;
// scanf("%d", &t);
while (t--) solve();
return 0;
}
实现细节
- `
参考示意图
-
`
参考链接
- `
作者 | 乐意奥AI