知识点:双向搜索
这个题除了双向搜索,那么就是浮点数向整数转换,以及我把结果的统计放在参数里面比我递归到最后统计的再统计要慢很多,可能是那些数学函数比较费时间把
#include <bits/stdc++.h>
using namespace std;
const int N = 5e6 + 5;
int n, m, a[7], b[7], c[N], cnt, ans;
void dfs1(int k, int cur) {
if (k == n / 2 + 1) {
c[++cnt] = cur;
return;
}
for (int i = 1; i <= m; i++) {
dfs1(k + 1, cur + a[k] * (int) round(pow(i, b[k])));
}
}
void dfs2(int k, int cur) {
if (k == n + 1) {
int p1 = upper_bound(c + 1, c + cnt + 1, -cur) - c;
int p2 = lower_bound(c + 1, c + cnt + 1, -cur) - c;
ans += p1 - p2;
return;
}
for (int i = 1; i <= m; i++) {
dfs2(k + 1, cur + a[k] * (int) round(pow(i, b[k])));
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i] >> b[i];
}
dfs1(1, 0);
sort(c + 1, c + cnt + 1);
dfs2(n / 2 + 1, 0);
cout << ans;
return 0;
}