#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]); } |
English