题目(材料题)
01 #include <algorithm>
02 #include <cstdio>
03 #include <cstring>
04 #include <vector>
05 #define ll long long
06 int n, m;
07 std::vector<int> k, p;
08 inline int mpow(int x, int k) {
09 int ans = 1;
10 for (; k; k = k >> 1, x = x * x) {
11 if (k & 1)
12 ans = ans * x;
13 }
14 return ans;
15 }
16 std::vector<int> ans1, ans2;
17 int cnt1, cnt2;
18 inline void dfs(std::vector<int>& ans, int& cnt, int l, int r, int v) {
19 if (l > r) {
20 ++cnt;
21 ans.push_back(v);
22 return;
23 }
24 for (int i = 1; i <= m; ++i) {
25 dfs(ans, cnt, l + 1, r, v + k[l] * mpow(i, p[l]));
26 }
27 return;
28 }
29 std::vector<int> cntans1;
30 int main() {
31 scanf("%d%d", &n, &m);
32 k.resize(n + 1);
33 p.resize(n + 1);
34 for (int i = 1; i <= n; ++i) {
35 scanf("%d%d", &k[i], &p[i]);
36 }
37 dfs(ans1, cnt1, 1, n >> 1, 0);
38 dfs(ans2, cnt2, (n >> 1) + 1, n, 0);
39 std::sort(ans1.begin(), ans1.end());
40 int newcnt1 = 1;
41 cntans1.push_back(1);
42 for (int i = 1; i < cnt1; ++i) {
43 if (ans1[i] == ans1[newcnt1 - 1]) {
44 ++cntans1[newcnt1 - 1];
45 } else {
46 ans1[newcnt1++] = ans1[i];
47 cntans1.push_back(1);
48 }
49 }
50 cnt1 = newcnt1;
51 std::sort(ans2.begin(), ans2.end());
52 int las = 0;
53 ll ans = 0;
54 for (int i = cnt2 - 1; i >= 0; --i) {
55 for (; las < cnt1 && ans1[las] + ans2[i] < 0; ++las)
56 ;
57 if (las < cnt1 && ans1[las] + ans2[i] == 0)
58 ans += cntans1[las];
59 }
60 printf("%lld\n", ans);
61 return 0;
62 }

关注我们