Submission #3982

#TimeUsernameProblemLanguageResultExecution timeMemory
3982imsifileBlock stacker (kriii1_B)C++98
1 / 1
104 ms3688 KiB
#include<stdio.h>
#include<memory.h>
#define mod 1000000007

int k, w, h, col;
long long lng[333][333], tw[333][333], ha[333], dap[333][333];
// 각 color로 길이 j인 막대를 만들 수 있는가

int main(){
	int i, j, t;
	scanf("%d%d%d", &k, &w, &h);
	for(i=0; i<k; i++)lng[i][0]=1;
	for(i=0; i<k; i++){
		scanf("%d", &col), col--;
		for(j=i+1; j<=w; j++)lng[col][j]+=lng[col][j-i-1];
	}
	ha[0]=1;
	for(i=1; i<=w; i++){
		for(j=0; j<k; j++){
			for(t=1; t<=i; t++){
				if(!lng[j][t])continue;
				if(t==i)tw[j][i]++;
				else tw[j][i]+=ha[i-t]-tw[j][i-t];
				if(tw[j][i]>=mod)tw[j][i]-=mod;
				if(tw[j][i]<0)tw[j][i]+=mod;
			}
			ha[i]+=tw[j][i];
			if(ha[i]>=mod)ha[i]-=mod;
		}
	}
	for(j=0; j<=w; j++)dap[0][j]=1;
	for(i=1; i<=h; i++){
		dap[i][0]=1;
		for(j=1; j<=w; j++){
			dap[i][j]=(dap[i][j-1]+dap[i-1][j]*ha[j])%mod;
			for(t=1; t<j; t++){
				dap[i][j]+=(dap[i-1][t]*ha[t])%mod*dap[i][j-t-1];
				dap[i][j]%=mod;
			}
		}
	}
	printf("%lld", dap[h][w]);
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...