Submission #1219233

#TimeUsernameProblemLanguageResultExecution timeMemory
1219233arbuzickNoM (RMI21_nom)C++20
100 / 100
113 ms16220 KiB
#include <bits/stdc++.h> using namespace std; constexpr int MOD = 1e9 + 7; int binpow(int n, int k) { int ans = 1; while (k) { if (k & 1) { ans = ans * 1LL * n % MOD; } n = n * 1LL * n % MOD; k >>= 1; } return ans; } void solve() { int n, m; cin >> n >> m; vector<int> sz(m); for (int i = 0; i < n * 2; ++i) { sz[i % m]++; } vector<int> f(n * 2 + 1), _f(n * 2 + 1); f[0] = _f[0] = 1; for (int i = 1; i <= n * 2; ++i) { f[i] = f[i - 1] * 1LL * i % MOD; _f[i] = binpow(f[i], MOD - 2); } auto c = [&](int n, int k) -> int { return f[n] * 1LL * _f[k] % MOD * _f[n - k] % MOD; }; vector<int> dp(n + 1); vector<vector<int>> dp_nw(m + 1, vector<int>(n + 1)); dp_nw[0][0] = 1; for (int i = 0; i < m; ++i) { for (int cnt_prv = 0; cnt_prv <= n; ++cnt_prv) { for (int add = 0; cnt_prv + add <= n && add * 2 <= sz[i]; ++add) { dp_nw[i + 1][cnt_prv + add] += dp_nw[i][cnt_prv] * 1LL * c(sz[i], add * 2) % MOD * f[add * 2] % MOD * c(n - cnt_prv, add) % MOD; if (dp_nw[i + 1][cnt_prv + add] >= MOD) { dp_nw[i + 1][cnt_prv + add] -= MOD; } } } } for (int cnt = n; cnt >= 0; --cnt) { dp[cnt] = dp_nw[m][cnt]; dp[cnt] = dp[cnt] * 1LL * f[n * 2 - cnt * 2] % MOD; for (int cnt2 = cnt + 1; cnt2 <= n; ++cnt2) { dp[cnt] = (dp[cnt] - (dp[cnt2] * 1LL * c(cnt2, cnt) % MOD) + MOD) % MOD; } } cout << dp[0] << '\n'; } signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int t = 1; // cin >> t; while (t--) { solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...