//Autor: Bartłomiej Czarkowski
#include <bits/stdc++.h>
using namespace std;
const int N = 3010;
const int MOD = 1e9 + 7;
int n, m, odp;
int dp[N][N][2][2]; // jaki prefiks | ile otwartych kolorów już było
// 0 - kończy się elementem, od którego można zacząć operację
// 1 - kończy się elementem, od którego nie można zacząć operacji
// 0 - kończy się elementem, na którym można było skończyć operację
// 1 - kończy się elementem, na którym nie można było skończyć operacji
int main() {
scanf("%d%d", &n, &m);
dp[1][1][0][1] = m;
for (int i = 2; i <= n; ++i) {
for (int j = 1; j <= min(i, m); ++j) {
dp[i][j][0][0] = (long long) (dp[i - 1][j][0][0] + dp[i - 1][j][1][0]) * j % MOD;
dp[i][j][0][1] = (long long) (dp[i - 1][j - 1][0][0] + dp[i - 1][j - 1][1][0]) * (m - j + 1) % MOD;
dp[i][j][1][0] = (long long) (dp[i - 1][j][0][1] + dp[i - 1][j][1][1]) * j % MOD;
dp[i][j][1][1] = (long long) (dp[i - 1][j][0][1] + dp[i - 1][j][1][1]) * (m - j) % MOD;
}
}
for (int i = 1; i <= n; ++i) {
odp += dp[n][i][0][0];
if (odp >= MOD) {
odp -= MOD;
}
odp += dp[n][i][1][0];
if (odp >= MOD) {
odp -= MOD;
}
}
printf("%d\n", odp);
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 38 39 40 41 42 | //Autor: Bartłomiej Czarkowski #include <bits/stdc++.h> using namespace std; const int N = 3010; const int MOD = 1e9 + 7; int n, m, odp; int dp[N][N][2][2]; // jaki prefiks | ile otwartych kolorów już było // 0 - kończy się elementem, od którego można zacząć operację // 1 - kończy się elementem, od którego nie można zacząć operacji // 0 - kończy się elementem, na którym można było skończyć operację // 1 - kończy się elementem, na którym nie można było skończyć operacji int main() { scanf("%d%d", &n, &m); dp[1][1][0][1] = m; for (int i = 2; i <= n; ++i) { for (int j = 1; j <= min(i, m); ++j) { dp[i][j][0][0] = (long long) (dp[i - 1][j][0][0] + dp[i - 1][j][1][0]) * j % MOD; dp[i][j][0][1] = (long long) (dp[i - 1][j - 1][0][0] + dp[i - 1][j - 1][1][0]) * (m - j + 1) % MOD; dp[i][j][1][0] = (long long) (dp[i - 1][j][0][1] + dp[i - 1][j][1][1]) * j % MOD; dp[i][j][1][1] = (long long) (dp[i - 1][j][0][1] + dp[i - 1][j][1][1]) * (m - j) % MOD; } } for (int i = 1; i <= n; ++i) { odp += dp[n][i][0][0]; if (odp >= MOD) { odp -= MOD; } odp += dp[n][i][1][0]; if (odp >= MOD) { odp -= MOD; } } printf("%d\n", odp); return 0; } |
English