#include<bits/stdc++.h>
using namespace std;
constexpr long long mod = 1e9 + 7;
constexpr int MAXN = 3e3 + 7;
int n;
long long m;
long long dp[MAXN][MAXN];
long long dps[MAXN][MAXN];
long long dpss[MAXN][MAXN];
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m;
dp[1][1] = m;
for (int i = 1; i <= n; i++)
{
for (int k = 1; k * 2 <= n + 4; k++){
if (i > 1 || k > 1)
dp[i][k] = (dpss[i - 1][k - 1] * (m - k + 1)) % mod;
dps[i][k] = (dps[i - 1][k] * (m - k) + dp[i][k]) % mod;
dpss[i][k] = ((dpss[i - 1][k] + dps[i - 1][k]) * (long long)k) % mod;
}
}
long long res = 0;
for (long long k = 1; k < n; k++)
res = (res + k * (dps[n - 1][k] + dpss[n - 1][k])) % mod;
cout << res << "\n";
return 0;
}
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 | #include<bits/stdc++.h> using namespace std; constexpr long long mod = 1e9 + 7; constexpr int MAXN = 3e3 + 7; int n; long long m; long long dp[MAXN][MAXN]; long long dps[MAXN][MAXN]; long long dpss[MAXN][MAXN]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; dp[1][1] = m; for (int i = 1; i <= n; i++) { for (int k = 1; k * 2 <= n + 4; k++){ if (i > 1 || k > 1) dp[i][k] = (dpss[i - 1][k - 1] * (m - k + 1)) % mod; dps[i][k] = (dps[i - 1][k] * (m - k) + dp[i][k]) % mod; dpss[i][k] = ((dpss[i - 1][k] + dps[i - 1][k]) * (long long)k) % mod; } } long long res = 0; for (long long k = 1; k < n; k++) res = (res + k * (dps[n - 1][k] + dpss[n - 1][k])) % mod; cout << res << "\n"; return 0; } |
English