//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; } |