제출 #551819

#제출 시각아이디문제언어결과실행 시간메모리
551819HanksburgerTents (JOI18_tents)C++17
100 / 100
110 ms71088 KiB
#include <bits/stdc++.h> using namespace std; const long long mod=1000000007, half=500000004; long long dp[3005][3005], fac[3005], invfac[3005], invpow[3005]; long long power(long long a, long long b) { if (!b) return 1; long long res=power(a, b/2); if (b&1) return res*res%mod*a%mod; else return res*res%mod; } long long nCr(long long n, long long r) { return fac[n]*invfac[r]%mod*invfac[n-r]%mod; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); fac[0]=1; for (long long i=1; i<=3000; i++) fac[i]=fac[i-1]*i%mod; invfac[3000]=power(fac[3000], mod-2); for (long long i=2999; i>=0; i--) invfac[i]=invfac[i+1]*(i+1)%mod; invpow[0]=1; for (long long i=1; i<=3000; i++) invpow[i]=invpow[i-1]*half%mod; for (long long i=0; i<=3000; i++) dp[0][i]=1; for (long long i=1; i<=3000; i++) dp[i][0]=1; for (long long i=1; i<=3000; i++) for (long long j=1; j<=3000; j++) dp[i][j]=(dp[i-1][j-1]*j*4+dp[i-1][j])%mod; long long n, m, ans=0; cin >> n >> m; for (long long i=0; i<=min(n, m/2); i++) { for (long long j=0; j<=min((n-i)/2, m-i*2); j++) { long long num1=nCr(n, i); long long num2=fac[m]*invfac[m-i*2]%mod*invpow[i]%mod; long long num3=nCr(m-i*2, j); long long num4=fac[n-i]*invfac[n-i-j*2]%mod*invpow[j]%mod; ans=(ans+num1*num2%mod*num3%mod*num4%mod*dp[n-i-j*2][m-i*2-j])%mod; } } cout << ans-1; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...