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
| int main() { init(); auto solve = [&](auto &self, poly *a, int l, int r) -> poly { if (l == r) return a[l]; int mid = (l + r) >> 1; return self(self, a, l, mid) * self(self, a, mid + 1, r); }; int n, m, k; std::vector<poly> all; std::cin >> m >> n >> k; for (int i = 1, v; i <= m; ++ i) { scanf("%d", &v); poly cur(v); for (int i = 0; i < v; ++ i) cur[i] = (LL) C(v - 1, v - 1 - i) * infact[v - i] % Mod; all.push_back(cur); } auto g = solve(solve, all.data(), 0, (int) all.size() - 1); for (int i = 0; i <= n - m; ++ i) g[i] = (LL) g[i] * fact[n - i] % Mod;
int res = 0; for (int i = k, op = 1; i <= n - m; ++ i, op = Mod - op) res = (res + (LL) op * C(i, k) % Mod * g[i]) % Mod; std::cout << res << std::endl; return 0; }
|
Related Issues not found
Please contact @mydcwfy to initialize the comment