Submission #1281793

#TimeUsernameProblemLanguageResultExecution timeMemory
1281793Jawad_Akbar_JJTents (JOI18_tents)C++20
100 / 100
555 ms294976 KiB
#include <iostream> #include <vector> using namespace std; const int N = 5005; int seen[N][N], dp[N][N], ch[N][N], fac[N], inv[N], mod = 1e9 + 7; long long Ans; int calc(int n, int m){ if (n == 0 or m == 0) return 1; if (seen[n][m]) return dp[n][m]; seen[n][m] = seen[m][n] = 1; dp[n][m] = dp[m][n] = (1LL * m * 4 * calc(n-1, m-1) + calc(n-1, m)) % mod; return dp[n][m]; } int n, m; void get(int a, int b){ if (a + b + b > n or a + a + b > m) return; Ans += 1LL * ch[n][a] * ch[m][2 * a] % mod * ch[n-a][2 * b] % mod * ch[m-2*a][b] % mod * fac[2 * a] % mod * fac[2 * b] % mod * inv[a + b] % mod * calc(n - a - b - b, m - a - a - b) % mod;// % mod; } signed main(){ inv[N-1] = 105853511; for (int i=N-2;i>=0;i--) inv[i] = inv[i+1] * 2 % mod; for (int i=1;i<N;i++){ for (int j=ch[i-1][0]=1;j<N;j++) ch[i][j] = (ch[i-1][j-1] + ch[i-1][j]) % mod; } for (int i=fac[0]=1;i<N;i++) fac[i] = 1LL * fac[i-1] * i % mod; calc(N-1, N-1); cin>>n>>m; for (int a = 0;a <= n; a++){ for (int b = 0;a + b + b <= n and a + a + b <= m;b++) get(a, b); } cout<<(Ans - 1 + mod) % mod<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...