#include <cstdio> #include <vector> int MODUL = 0; int dodaj(int b, int a) { int wynik = a + b; if (wynik > MODUL) { wynik -= MODUL; } return wynik; } int odejmij(int a, int b) { int wynik = a - b; if (wynik < 0) { wynik += MODUL; } return wynik; } int pomnoz(int b, int a) { long long wynik = a; wynik *= b; if (wynik > MODUL) { wynik %= MODUL; } return wynik; } int main() { int n, m; scanf("%d %d %d", &n, &m, &MODUL); std::vector<int> B(m+1, 0); for (int I = 0; I < m; ++I) { B[I+1] = dodaj(B[I], I+1); } for (int s = 2; s <= n; ++s) { std::vector<int> Bn(m+1, 0); int S = 0; for (int I = 0; I < m; ++I) { S = dodaj(S, B[I]); Bn[I+1] = dodaj(Bn[I], odejmij(pomnoz(I + 1, odejmij(B[m], B[m-I-1])), S)); } B.swap(Bn); } printf("%d\n", B[m]); }
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 57 | #include <cstdio> #include <vector> int MODUL = 0; int dodaj(int b, int a) { int wynik = a + b; if (wynik > MODUL) { wynik -= MODUL; } return wynik; } int odejmij(int a, int b) { int wynik = a - b; if (wynik < 0) { wynik += MODUL; } return wynik; } int pomnoz(int b, int a) { long long wynik = a; wynik *= b; if (wynik > MODUL) { wynik %= MODUL; } return wynik; } int main() { int n, m; scanf("%d %d %d", &n, &m, &MODUL); std::vector<int> B(m+1, 0); for (int I = 0; I < m; ++I) { B[I+1] = dodaj(B[I], I+1); } for (int s = 2; s <= n; ++s) { std::vector<int> Bn(m+1, 0); int S = 0; for (int I = 0; I < m; ++I) { S = dodaj(S, B[I]); Bn[I+1] = dodaj(Bn[I], odejmij(pomnoz(I + 1, odejmij(B[m], B[m-I-1])), S)); } B.swap(Bn); } printf("%d\n", B[m]); } |