40pts code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN = 1e2 + 7, Mod = 9999973;
int n, m;
ll F[MAXN][MAXN][MAXN];
ll C(ll x) {
return (x * (x - 1) / 2) % Mod;
}
int main () {
cin >> n >> m;
F[0][0][0] = 1;
for (int i = 1; i <= n; i ++) {
for (int j = 0; j <= m; j ++) {
for (int k = 0; k <= m - j; k ++) {
F[i][j][k] = F[i - 1][j][k] + (k >= 1 ? F[i - 1][j + 1][k - 1] * (j + 1) : 0LL) + (j >= 1 ? F[i - 1][j - 1][k] * (m - j - k + 1) : 0LL) +
(k >= 1 ? F[i - 1][j][k - 1] * j * (m - j - k + 1) : 0LL) + (j >= 2 ? F[i - 1][j - 2][k] * C(m - j - k + 2) : 0LL) +
(k >= 2 ? F[i - 1][j + 2][k - 2] * C(j + 2) : 0LL) % Mod;
}
}
}
ll ans = 0;
for (int i = 0; i <= m; i ++)
for (int j = 0; j <= m - i; j ++)
ans += F[n][i][j], ans %= Mod;
cout << ans << '\n';
return 0;
}
100pts code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN = 1e2 + 7, Mod = 9999973;
int n, m;
ll F[MAXN][MAXN][MAXN];
ll C(ll x) {
return (x * (x - 1) / 2) % Mod;
}
int main () {
cin >> n >> m;
F[0][0][0] = 1;
for (int i = 1; i <= n; i ++) {
for (int j = 0; j <= m; j ++) {
for (int k = 0; k <= m - j; k ++) {
F[i][j][k] = F[i - 1][j][k];
if (k >= 1) F[i][j][k] += F[i - 1][j + 1][k - 1] * (j + 1);
if (j >= 1) F[i][j][k] += F[i - 1][j - 1][k] * (m - j - k + 1);
if (k >= 1) F[i][j][k] += F[i - 1][j][k - 1] * j * (m - j - k + 1);
if (j >= 2) F[i][j][k] += F[i - 1][j - 2][k] * C(m - j - k + 2);
if (k >= 2) F[i][j][k] += F[i - 1][j + 2][k - 2] * C(j + 2);
F[i][j][k] %= Mod;
}
}
}
ll ans = 0;
for (int i = 0; i <= m; i ++)
for (int j = 0; j <= m - i; j ++)
ans += F[n][i][j], ans %= Mod;
cout << ans << '\n';
return 0;
}