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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| #include <cstdio> #define int long long
int a[10005], b[10005], f[1005], len, id;
int qpow(int a, int b, int mod) { int ret = 1LL; while (b) { if (b & 1) ret = ret * a % mod; a = a * a % mod; b >>= 1; } return ret; } void exgcd(int a, int b, int &x, int &y) { if (!b) x = 1, y = 0; else exgcd(b, a % b, y, x), y -= a / b * x; } int inv(int a, int p) { int x, y; exgcd(a, p, x, y); x = (x % p + p) % p; if (!x) return p; return x; } int fact(int n, int p, int mod, int id) { if (!n) return 1; int sum = 1LL; sum = qpow(f[id], n / mod, mod); for (int i = 1; i <= n % mod; ++ i) if (i % p) sum = sum * i % mod; return sum * fact(n / p, p, mod, id) % mod; } int C(int n, int m, int p, int mod, int id) { if (n < m) return 0; if (!n || !m || n == m) return 1; int cnt = 0, k = n - m, ans; ans = fact(n, p, mod, id) * inv(fact(m, p, mod, id), mod) % mod * inv(fact(k, p, mod, id), mod) % mod; while (n) n /= p, cnt += n; while (m) m /= p, cnt -= m; while (k) k /= p, cnt -= k; ans = ans * qpow(p, cnt, mod) % mod; return ans; }
int CRT() { int ans = 0LL, sum = 1LL; for (int i = 1; i <= len; ++ i) sum *= a[i]; for (int i = 1; i <= len; ++ i) { int m = sum / a[i] * inv(sum / a[i], a[i]) % sum; ans = (ans + b[i] * m % sum) % sum; } return ans; }
int exLucas(int n, int m, int p) { if (n <= 0 || n < m) return 0; len = 0; int k = 1, id = 0; while (p != 1) { ++ k; if (p % k) continue; int cnt = 0, mod = 1LL; while (p % k == 0) ++ cnt, p /= k, mod *= k; a[++ len] = mod, b[len] = C(n, m, k, mod, ++ id); } return CRT(); }
void init(int p) { int k = 1; while (p != 1) { ++ k; if (p % k) continue; int cnt = 0, mod = 1LL; while (p % k == 0) ++ cnt, p /= k, mod *= k; ++ id; f[id] = 1LL; for (int i = 1; i <= mod; ++ i) if (i % k) f[id] = f[id] * i % mod; } } int A[10];
signed main() { int T, p; scanf("%lld%lld", &T, &p); init(p); while (T --) { int n, n1, n2, m, ans = 0; scanf("%lld%lld%lld%lld", &n, &n1, &n2, &m); for (int i = 1; i <= n1; ++ i) scanf("%lld", A + i); for (int i = 1; i <= n2; ++ i) { int x; scanf("%lld", &x); m -= x - 1; } for (int S = 0; S < 1 << n1; ++ S) { int cnt = 0, tmp = m; for (int i = 1; i <= n1; ++ i) if (S & 1 << i - 1) ++ cnt, tmp -= A[i]; ans = (ans + (cnt & 1 ? -1 : 1) * exLucas(tmp - 1, n - 1, p)) % p; } printf("%lld\n", (ans + p) % p); } return 0; }
|