1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| #include <bits/stdc++.h>
#define log printf #define EPS 1e-8 #define INF 0x3f3f3f3f #define FOR(i, l, r) for (int i = (l); i <= (r); ++i) #define IOS \ ios::sync_with_stdio(false); \ cin.tie(nullptr); #define Buffer 1 << 23
char buf[Buffer], *p1 = buf, *p2 = buf, obuf[Buffer], *p3 = obuf; #define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, Buffer, stdin), p1 == p2) ? EOF : *p1++) #define putchar(x) (p3 - obuf < Buffer) ? (*p3++ = x) : (fwrite(obuf, p3 - obuf, 1, stdout), p3 = obuf, *p3++ = x)
using namespace std;
typedef __int128 i128; typedef long long ll; typedef pair<int, int> PII;
const int N = 10; int m, n, ans; PII x[N]; unordered_map<int, int> mp;
template <typename T>
inline T read() { T sum = 0, fl = 1; char ch = getchar(); for (; !isdigit(ch); ch = getchar()) if (ch == '-') fl = -1; for (; isdigit(ch); ch = getchar()) sum = sum * 10 + ch - '0'; return sum * fl; }
template <typename T>
inline void write(T x) { if (x < 0) putchar('-'), x = -x; static char sta[40]; short top = 0; do { sta[top++] = (x % 10) + 48, x /= 10; } while (x); while (top) putchar(sta[--top]); }
int power(int x, int y) { int ret = 1; while (y > 0) { if (y & 1) ret *= x; x *= x; y >>= 1; } return ret; }
void dfs1(int now, int sum) { if (now > (n >> 1)) { ++mp[sum]; return; } FOR(i, 1, m) dfs1(now + 1, sum + x[now].first * power(i, x[now].second)); }
void dfs2(int now, int sum) { if (now > n) { ans += mp.find(-sum) == mp.end() ? 0 : mp[-sum]; return; } FOR(i, 1, m) dfs2(now + 1, sum + x[now].first * power(i, x[now].second)); }
int main() { n = read<int>(), m = read<int>(); FOR(i, 1, n) x[i] = {read<int>(), read<int>()}; dfs1(1, 0); dfs2((n >> 1) + 1, 0); write<int>(ans); fwrite(obuf, p3 - obuf, 1, stdout); return 0; }
|