#include <vector> #include <array> #include <cinttypes> #include <cstring> #include <climits> #include<iostream> using namespace std; namespace wzor { const int64_t MMOD = 1'000'000'007; } int64_t solve_wzor(int64_t n, int64_t m) { //Śmieszna historia, czytając to zadanie pomyliłem się i myślałem że na wejściu mamy //podane jeszcze k, oznaczające ilość dnii po których Bajtazar ma skończyć, a Bajtazar musi skończyć dzień przy pierwszej możliwej okazji //Co ciekawe takie zadanie da się rozwiązać przy lepszym modulo, bądź trochę mniejszym wejściu //bo stała, ale działałoby w n^2 log n using namespace wzor; vector<vector<vector<int64_t>>> dp(n + 1, vector<vector<int64_t>>(n + 1, vector<int64_t>(2, 0))); //dp[number of position][number of used colors][is color trail] dp[1][1][0] = m; for(int64_t i = 2; i <= n - 1; ++i) { for(int64_t j = 1; j <= n; ++j) { dp[i][j][0] = dp[i - 1][j][0] * (m - j) + dp[i - 1][j - 1][1] * (m - j + 1); dp[i][j][0] %= MMOD; dp[i][j][1] = dp[i - 1][j][1] * j + dp[i - 1][j][0] * j; dp[i][j][1] %= MMOD; } } /*for(int i = 1; i <= n; ++i) { cout << i << ": "; for(int j = 1; j <= n; ++j) { cout << dp[i][j][0] << ' ' << dp[i][j][1] << " | "; } cout << '\n'; }*/ int64_t ans = 0; for(int i = 1; i <= n; ++i) { ans += (dp[n - 1][i][0] + dp[n - 1][i][1]) * i; ans %= MMOD; } return ans; } #include <iostream> int main() { int a, b; std::cin >> a >> b; std::cout << solve_wzor(a, b); }
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include <vector> #include <array> #include <cinttypes> #include <cstring> #include <climits> #include<iostream> using namespace std; namespace wzor { const int64_t MMOD = 1'000'000'007; } int64_t solve_wzor(int64_t n, int64_t m) { //Śmieszna historia, czytając to zadanie pomyliłem się i myślałem że na wejściu mamy //podane jeszcze k, oznaczające ilość dnii po których Bajtazar ma skończyć, a Bajtazar musi skończyć dzień przy pierwszej możliwej okazji //Co ciekawe takie zadanie da się rozwiązać przy lepszym modulo, bądź trochę mniejszym wejściu //bo stała, ale działałoby w n^2 log n using namespace wzor; vector<vector<vector<int64_t>>> dp(n + 1, vector<vector<int64_t>>(n + 1, vector<int64_t>(2, 0))); //dp[number of position][number of used colors][is color trail] dp[1][1][0] = m; for(int64_t i = 2; i <= n - 1; ++i) { for(int64_t j = 1; j <= n; ++j) { dp[i][j][0] = dp[i - 1][j][0] * (m - j) + dp[i - 1][j - 1][1] * (m - j + 1); dp[i][j][0] %= MMOD; dp[i][j][1] = dp[i - 1][j][1] * j + dp[i - 1][j][0] * j; dp[i][j][1] %= MMOD; } } /*for(int i = 1; i <= n; ++i) { cout << i << ": "; for(int j = 1; j <= n; ++j) { cout << dp[i][j][0] << ' ' << dp[i][j][1] << " | "; } cout << '\n'; }*/ int64_t ans = 0; for(int i = 1; i <= n; ++i) { ans += (dp[n - 1][i][0] + dp[n - 1][i][1]) * i; ans %= MMOD; } return ans; } #include <iostream> int main() { int a, b; std::cin >> a >> b; std::cout << solve_wzor(a, b); } |