Submission #1298319

#TimeUsernameProblemLanguageResultExecution timeMemory
1298319arnur2937Tents (JOI18_tents)C++20
48 / 100
252 ms409688 KiB
#include <bits/stdc++.h> // #pragma GCC target ("avx2") // #pragma GCC optimize ("O3") // #pragma GCC optimize ("unroll-loops") using namespace std; #define speed ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define Int __int128 #define int long long #define dl double long #define fl float #define all(s) s.begin(), s.end() #define lall(s) ++s.begin(), s.end() #define pub push_back #define puf push_front #define pob pop_back #define pof pop_front #define ins insert #define F first #define S second const int N = 100000 + 5; const int M = 1000 + 5; const int LN = 131072; const int MOD = 1e9 + 7;//998244353; const int BLOCK = 500; const int inf = 1e12; const int INF = 1e18; const double pi = 3.14159265358979323846; const vector<array<int, 2>> DS {{0, -1}, {0, 1}, {-1, 0}, {1, 0}}; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int binpow(int a, int b) {//, int MOD) { int res = 1; a %= MOD; while (b > 0) { if (b & 1) { res = res * a; res %= MOD; } a = a * a; a %= MOD; b >>= 1; } return res; } int mdiv(int a, int b) { int ret = (a % MOD) * binpow(b, MOD - 2); ret %= MOD; return ret; } int mul(int a, int b) { int ret = (a % MOD) * (b % MOD); ret %= MOD; return ret; } int add(int a, int b) { int ret = (a % MOD) + (b % MOD); ret %= MOD; return ret; } int sub(int a, int b) { int ret = (a % MOD) - (b % MOD); ret = (ret + MOD) % MOD; return ret; } int GCD(int a, int b) { if (b == 0) { return a; } return GCD(b, a % b); } struct pqComp { bool operator()(const pair<int, int>& p1, const pair<int, int>& p2) { return (p1.F < p2.F) || (p1.F == p2.F && p1.S < p2.S); } }; bool pCompF(pair<int, int>& p1, pair<int, int>& p2) { return p1.F < p2.F; } bool pCompS(const pair<int, int>& p1, const pair<int, int>& p2) { return p1.S < p2.S; } bool pCompFS(pair<int, int>& p1, pair<int, int>& p2) { return (p1.S < p2.S) || (p1.S == p2.S && p1.F < p2.F); } int dp[301][301][601]; void solve() { int n, m; cin >> n >> m; for (int i = 0; i <= n; ++i) { dp[i][0][0] = 1; } for (int i = 0; i <= m; ++i) { dp[0][i][0] = 1; } for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { dp[i][j][0] = 1; for (int k = 1; k <= min(i, j); ++k) { dp[i][j][k] = mul(dp[i - 1][j - 1][k - 1], i * j * 4); if (j >= 2) { dp[i][j][k] = add(dp[i][j][k], mul(dp[i - 1][j - 2][k - 1], j * (j - 1) / 2 * i)); } if (i >= 2) { dp[i][j][k] = add(dp[i][j][k], mul(dp[i - 2][j - 1][k - 1], i * (i - 1) / 2 * j)); } } } } int ans = 0, f = 1; for (int i = 1; i <= min(n, m); ++i) { f = mul(f, i); ans = add(ans, mdiv(dp[n][m][i], f)); } cout << ans; } signed main() { speed; int T = 1; //cin >> T; while (T--) { solve(); } } /* НЕ ЗАХОДИТ РЕШЕНИЕ? 1) ПРОВЕРЬ НА ОЧЕВИДНЫЕ ОШИБКИ В КОДЕ 2) ПРОВЕРЬ НА ПЕРЕПОЛНЕНИЯ 3) УБЕДИСЬ В ПРАВИЛЬНОСТИ АЛГОРИТМА */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...