#include <iostream> using namespace std; int N; long long K, M = 1000000007; long long T[3001][3000] = {}; void REK(int n, int s) { // parametr s mówi o ile drzew mniej rozważam niż K long long ile = 0, potega_Ks = K - s; for (int i = 2; i <= N - 2; i++) { if (s < K - 1) { if (T[N - i][s + 1] == 0) REK(N - i, s + 1); ile = ((potega_Ks * T[N - i][s + 1]) % M + ile) % M; } potega_Ks = (potega_Ks * (K - s)) % M; } potega_Ks = (potega_Ks * (K - s)) % M; ile = (potega_Ks + ile) % M; T[n][s] = ile; return; } int main() { cin >> N >> K; // wyliczam explicite dla N == 2 i N == 3: int zakres = (int) K; if (zakres > N) zakres = N; for (int s = 0; s < zakres; s++) { T[2][s] = K - s; T[3][s] = ((K - s) * (K - s)) % M; } if (N < 2) cout << 0; else if (T[N][0] > 0) cout << T[N][0]; else { REK(N, 0); cout << T[N][0]; } 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 43 44 | #include <iostream> using namespace std; int N; long long K, M = 1000000007; long long T[3001][3000] = {}; void REK(int n, int s) { // parametr s mówi o ile drzew mniej rozważam niż K long long ile = 0, potega_Ks = K - s; for (int i = 2; i <= N - 2; i++) { if (s < K - 1) { if (T[N - i][s + 1] == 0) REK(N - i, s + 1); ile = ((potega_Ks * T[N - i][s + 1]) % M + ile) % M; } potega_Ks = (potega_Ks * (K - s)) % M; } potega_Ks = (potega_Ks * (K - s)) % M; ile = (potega_Ks + ile) % M; T[n][s] = ile; return; } int main() { cin >> N >> K; // wyliczam explicite dla N == 2 i N == 3: int zakres = (int) K; if (zakres > N) zakres = N; for (int s = 0; s < zakres; s++) { T[2][s] = K - s; T[3][s] = ((K - s) * (K - s)) % M; } if (N < 2) cout << 0; else if (T[N][0] > 0) cout << T[N][0]; else { REK(N, 0); cout << T[N][0]; } return 0; } |