Submission #569170

#TimeUsernameProblemLanguageResultExecution timeMemory
569170rawoti6303NoM (RMI21_nom)C++14
100 / 100
71 ms27936 KiB
#include <bits/stdc++.h> #define INF 1000000005 #define INFL 1000000000000000005ll #define EPS 1e-6 #define pb push_back #define pause system("pause") #define exit exit(0) #define endl '\n' using namespace std; using ull = unsigned long long; using ll = long long; typedef pair<ll, ll> pii; const int N = 2005, MOD = 1e9 + 7; int n, m, f[N], c[N][N], dp[N][N]; inline int add(int a, int b) { return a + b < MOD ? (a + b) : (a + b - MOD); } inline int mul(int a, int b) { return ((ll)a * b) % MOD; } inline void upd(int &a, int b) { a = add(a, b); } inline int bpow(int a, int b) { int ans = 1; while (b != 0) { if (b & 1) ans = mul(ans, a); a = mul(a, a), b >>= 1; } return ans; } int fact(int n) { int ans = 1; for (int i = 2; i <= n; ++i) { ans = mul(ans, i); } return ans; } int naive(int n, int m) { vector<int> p(2 * n); for (int i = 0; i < 2 * n; ++i) { p[i] = i + 1; } int ans = 0; do { bool ok = 1; for (int i = 0; ok && i < 2 * n; ++i) { for (int j = i + 1; j < 2 * n; ++j) { if (abs(p[i] - p[j]) == n) { ok &= ((j - i) % m) != 0; break; } } } ans += ok; } while (next_permutation(p.begin(), p.end())); return ans; } int main() { ios_base::sync_with_stdio(false); cin.tie(0), cout.tie(0); cin >> n >> m; //cout << naive(n, m) << endl; for (int i = 0; i <= n; ++i) { c[i][0] = 1; for (int j = 1; j <= i; ++j) { c[i][j] = add(c[i - 1][j - 1], c[i - 1][j]); } } for (int i = 0; i < 2 * n; ++i) { ++f[i % m]; } int sm = f[0]; dp[0][f[0]] = mul(c[n][f[0]], bpow(2, f[0])); for (int i = 0; i < m - 1; ++i) { for (int j = 0; j <= sm; ++j) { for (int k = 0; k <= j && k <= f[i + 1]; ++k) { if (j - k + f[i + 1] - k > n || dp[i][j] == 0) continue; upd(dp[i + 1][j - k + f[i + 1] - k], mul( dp[i][j], mul( c[j][k], mul( c[n - (((sm - j) / 2) + j)][f[i + 1] - k], bpow(2, f[i + 1] - k) ) ) ) ); } } sm += f[i + 1]; } int ans = dp[m - 1][0]; for (int i = 0; i < m; ++i) { ans = mul(ans, fact(f[i])); } cout << ans << endl; //pause; 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...