样例过了,但只有20分,其余全WA
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, k[10], p[10];
int xs[10];
int pow (int a, int b) {
if (b == 0) return 1;
int tmp = pow (a, b / 2);
tmp *= tmp;
if (b & 1) tmp *= a;
return tmp;
}
int calc (int beg, int end) {
int ans = 0;
for (int i = beg; i <= end; i++) ans += k[i] * pow (xs[i], p[i]);
return ans;
}
int s[10000000];
int num[10000000], cnt[10000000], l;
int cntans;
void findans (int tmp) {
int ip = lower_bound (num + 1, num + l + 1, tmp) - num;
if (num[ip] == tmp) cntans += cnt[ip];
}
void dfs1 (int id) {
if (id == (n >> 1) + 1) s[++s[0]] = calc (1, n >> 1);
else for (int i = 1; i <= m; i++) xs[id] = i, dfs1 (id + 1);
}
void dfs2 (int id) {
if (id == n + 1) findans (calc ((n >> 1) + 1, n));
else for (int i = 1; i <= m; i++) xs[id] = i, dfs2 (id + 1);
}
signed main () {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> k[i] >> p[i];
dfs1 (1);
sort (s + 1, s + s[0] + 1);
num[1] = s[1];
cnt[1] = 1;
l = 1;
for (int i = 2; i <= s[0]; i++)
if (num[l] == s[i]) ++cnt[l];
else {
num[++l] = s[i];
cnt[l] = 1;
}
dfs2 ((n >> 1) + 1);
cout << cntans;
return 0;
}