Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
29748 | gaochunzhen | 【BJ】T1 | C++ | 运行超时 | 20 | 3000 MS | 15188 KB | 1596 | 2024-05-26 17:40:33 |
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int Mod = 1e9 + 7; int fpow(int a, int b = Mod - 2) { int res = 1; while (b) { if (b & 1) res = 1ll * res * a % Mod; a = 1ll * a * a % Mod, b >>= 1; } return res; } ll s, t, n, m; namespace sub1 { int dp[109][10009], pw[1000009], ip[1000009]; int C(int n, int m) { if (n < m) return 0; else if (n == -1 && m == -1) return 1; return 1ll * pw[n] * ip[m] % Mod * ip[n - m] % Mod; } void Main() { pw[0] = ip[0] = 1; for (int i = 1; i <= 1e6; i++) { pw[i] = 1ll * pw[i - 1] * i % Mod; ip[i] = fpow(pw[i]); } dp[0][0] = 1; for (ll i = 1; i <= n; i++) { for (ll j = i; j <= i * t; j++) { for (ll k = 1; k <= min(j, t); k++) { (dp[i][j] += dp[i - 1][j - k]) %= Mod; } } } // for (int i = 1; i <= n; i++) { // for (int j = 1; j <= i * t; j++) { // cout << dp[i][j] << ' '; // } // cout << endl; // } int ans = 0; for (ll i = n; i <= min(s, n * t); i++) { for (ll j = m - n; j <= s - i; j++) { ans = (ans + 1ll * dp[n][i] * C(j - 1, m - n - 1)) % Mod; } } printf("%d\n", ans); } } int main() { scanf("%lld%lld%lld%lld", &s, &t, &n, &m); sub1::Main(); fclose(stdin); fclose(stdout); return 0; }