Submission #43054

#TimeUsernameProblemLanguageResultExecution timeMemory
43054ffresh마스코트 (JOI13_mascots)C++14
100 / 100
481 ms36652 KiB
#include <bits/stdc++.h> using namespace std; const int N =3005,mod = 1e9+7; #define ll long long ll per[N]; ll mypow(ll x,ll c){ ll ret=1; while(c){ if(c&1) ret= (ret*x)%mod; x = (x*x)%mod; c>>=1; } return ret; } int dp[N][N]; ll combi(int n,int c){ ll ret= per[n]; ret = (ret *mypow(per[c],mod-2))%mod; ret = (ret *mypow(per[n-c],mod-2))%mod; return ret; } int main(){ //freopen("input.txt","r",stdin); per[0]= 1; for(int i=1;i<N;++i)per[i]=(per[i-1]*i)%mod; int dx=N,dy =N,ux=0,uy = 0; int r,c,n; cin>>r>>c>>n; assert(r<N && c<N); for(int i=0;i<n;++i){ int u,v; cin>>u>>v; dx= min(dx,u),dy= min(dy,v); ux= max(ux,u),uy= max(uy,v); } int a = ux-dx+1; int b= uy-dy+1; int tot = a*b - n; ll ret = 1; for(int i=1;i<=tot;++i) ret= (ret*i)%mod; ret = (ret * combi(r-a,dx-1))%mod; ret = (ret*combi(c-b,dy-1))%mod; dp[0][0]=1; int x,y; int lx = r-a, ly = c-b; for(x=0;x<=lx;++x){ for(y=0;y<=ly;++y){ if(y<ly){ ll temp = a+x; temp = per[temp]; temp = (temp*dp[x][y])%mod; dp[x][y+1]= (dp[x][y+1]+ temp)%mod; } if(x<lx){ ll temp = b+y; temp = per[temp]; temp = (temp*dp[x][y])%mod; dp[x+1][y]= (dp[x+1][y]+ temp)%mod; } } } ret = (ret*dp[lx][ly])%mod; cout<<ret<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...