Submission #1184742

#TimeUsernameProblemLanguageResultExecution timeMemory
1184742mareksbTents (JOI18_tents)C++20
100 / 100
176 ms71304 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") using namespace std; const int64_t MOD=1e9+7; const int64_t N=3005; int64_t h,w; int64_t fac[N]; int64_t ifac[N]; int64_t pow2[N]; int64_t ipow2[N]; int64_t dp[N][N]; int64_t binexp(int64_t n, int64_t k){ int ans=1; while(k>0){ if(k%2==1){ ans=(ans*n)%MOD; } n=(n*n)%MOD; k/=2; } return ans; } int64_t inv(int64_t n){ return binexp(n,MOD-2); } int64_t c(int64_t n, int64_t k){ return (((fac[n]*ifac[k])%MOD)*ifac[k-1])%MOD; } int64_t fdp(int64_t n, int64_t m){ if(dp[n][m])return dp[n][m]; if(n<=0||m<=0)return 1; int64_t ans=fdp(n-1,m); ans=(ans+fdp(n-1,m-1)*4*m)%MOD; ans=(ans+fdp(n-2,m-1)*m*(n-1))%MOD; ans=(ans+fdp(n-1,m-2)*m*(m-1)/2)%MOD; dp[n][m]=ans; return ans; } void solve() { cin>>h>>w; for(int i=0;i<=h;i++){ for(int j=0;j<=w;j++){ dp[i][j]=1; } } fac[0]=1; pow2[0]=1; for(int i=1;i<N;i++){ fac[i]=(fac[i-1]*i)%MOD; pow2[i]=(pow2[i-1]*2)%MOD; } ifac[N-1]=inv(fac[N-1]); ipow2[N-1]=inv(pow2[N-1]); for(int i=N-2;i>=0;i--){ ifac[i]=(ifac[i+1]*(i+1))%MOD; ipow2[i]=(ipow2[i+1]*2)%MOD; } for(int i=0;i<=h;i++){ for(int j=0;j<=w;j++){ dp[i][j]=0; } } int64_t ans=(fdp(h,w)-1)%MOD; cout<<ans<<'\n'; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int64_t t=1; //cin>>t; while(t--){ solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...