제출 #485125

#제출 시각아이디문제언어결과실행 시간메모리
485125CSQ31Tents (JOI18_tents)C++17
48 / 100
152 ms94216 KiB
#include <bits/stdc++.h>
using namespace std;
#define MOD (ll)(1e9+7)
typedef long long int ll;
//each row <=2
//each col <=2
//cant have triangle
inline void mod(ll &x){
	if(x>=MOD)x-=MOD;
}
ll dp[2][301][301];
ll C[3001][3001];
int main()
{
	dp[0][0][0] = 1;
	for(int i=0;i<=3000;i++){
		for(int j=C[i][0] = 1;j<=i;j++){
			C[i][j] = C[i-1][j-1] + C[i-1][j];
			mod(C[i][j]);		
		}
	}
	int h,w;
	cin>>h>>w;
	for(int i=0;i<h;i++){
		for(int j=0;j<=w;j++){ //bad col
			for(int k=0;k<=w;k++){ //occu col
				if(!dp[0][j][k])continue;
				int emp = w-k-j;
				
				if(k){//place a single on occu and increase bad col by 1
					dp[1][j+1][k-1] += dp[0][j][k] * k %MOD;
					mod(dp[1][j+1][k-1]);
				}
				if(emp){
					//place a single on emp but its not faced south then increase bad col by 1
					dp[1][j+1][k] += dp[0][j][k] * 3 * emp%MOD;
					mod(dp[1][j+1][k]);
					//place a single on emp but its faced south then increase occu col by 1
					dp[1][j][k+1] += dp[0][j][k] * emp%MOD;
					mod(dp[1][j][k+1]);
				}
				if(emp>=2){//place two on emp and increase bad col by 2
					dp[1][j+2][k] += dp[0][j][k] * 1LL * C[emp][2]%MOD;
					dp[1][j+2][k]%=MOD;
				}
				dp[1][j][k]+=dp[0][j][k];
				mod(dp[1][j][k]);//do nothing
			}
		}
		for(int j=0;j<=w;j++){
			for(int k=0;k<=w;k++){
				dp[0][j][k] = dp[1][j][k];
				dp[1][j][k] = 0;
			}
		}
	} 	
	ll ans = 0;
	for(int i=0;i<=w;i++){
		for(int j=0;j<=w;j++){
			//cout<<i<<" "<<j<<" "<<dp[0][i][j]<<'\n';
			ans+=dp[0][i][j];
			mod(ans);	
		}
	}
	ans+=MOD-1;
	mod(ans);
	
	cout<<ans;
	
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...