Submission #1285023

#TimeUsernameProblemLanguageResultExecution timeMemory
1285023kerem마스코트 (JOI13_mascots)C++20
10 / 100
1 ms580 KiB
#include <bits/stdc++.h>
using namespace std;
#define int int64_t
#define pb push_back
#define fr first
#define sc second
#define all(x) x.begin(),x.end()
#define sp << " " <<
#define N 3000
#define inf (int)1e15
typedef pair<int,int> pii;

const int mod=100000007;
int n,m,fac[N*N+5],dp[N+5][N+5];
void init(int n){
	fac[0]=1;
	for(int i=1;i<=n;i++)
		fac[i]=fac[i-1]*i%mod;
}
int fp(int x,int y){
	int ans=1;
	for(;y;x=x*x%mod,y>>=1)
		if(y&1) ans=ans*x%mod;
	return ans;
}
int C(int n,int r){
	int a=fac[n];	
	int b=fac[r]*fac[n-r]%mod;
	return a*fp(b,mod-2)%mod;	
}
int calc(int x,int y){
	if(dp[x][y]) return dp[x][y];
	if(y<m) dp[x][y]+=fac[x]*calc(x,y+1)%mod;
	if(x<n) dp[x][y]+=fac[y]*calc(x+1,y)%mod;
	dp[x][y]%=mod;
	return dp[x][y];
}
void solve(){
	cin >> n >> m;
	init(n*m);
	int k;cin >> k;
	int x1=n,y1=m,x2=1,y2=1;
	for(int i=0;i<k;i++){
		int x,y;
		cin >> x >> y;
		x1=min(x1,x);
		x2=max(x2,x);
		y1=min(y1,y);
		y2=max(y2,y);
	}
	int X=x2-x1+1,Y=y2-y1+1;
	int ans=fac[X*Y-k];
	dp[n][m]=1;
	ans=ans*calc(X,Y)%mod;
	ans=ans*(C(n-X,x1-1)*C(m-Y,y1-1)%mod)%mod;
	cout << ans << "\n";
}
int32_t main(){
	//~ freopen("hopscotch.in","r",stdin);
	//~ freopen("hopscotch.out","w",stdout);
	
	cout << fixed << setprecision(0);
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);cout.tie(NULL);
	
	int test=1;
	//~ cin >> test;
	while(test--) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...