Submission #3564

#TimeUsernameProblemLanguageResultExecution timeMemory
3564wookayinBlock stacker (kriii1_B)C++98
1 / 1
160 ms2164 KiB
#include <stdio.h>
 
int K,W,H;
const int mod = 1000000007;
 
int A[303][303];
int B[303];
int Bp[303][303];
int D[303][303];
 
int dat[303];
 
int main()
{
    scanf("%d%d%d",&K,&W,&H);
        for(int i = 0; i < K;i ++){
                scanf("%d",&dat[i]);
                dat[i]--;
        }
        for(int i = 0; i < K; i++){
                A[i][0] = 1;
                for(int k = 0; k < K; k ++){
                        if (dat[k] != i) continue;
                        // length is k + 1, color is i
                        for(int j = 0; j + k + 1 <= W; j++) {
                                A[i][j + k + 1] |= A[i][j];
                        }
                }
        }
        B[0] = 1;
        for(int i = 1; i <= W; i ++) {
                B[i] = 0;
                for(int j = 1; j <= i; j++) {
                        for(int k = 0; k < K; k ++){
                                if (A[k][j]) {
                                        int val = B[i-j] - Bp[i-j][k];
                                        if (val < 0)
                                        {
                                                val += mod;
                                                val %= mod;
                                        }
                                        B[i] = (B[i] + val) % mod;
                                        Bp[i][k] = (Bp[i][k] + val) % mod; 
                                }
                        }
                }
        }
        for(int i = 0; i <= H; i++){
                for(int j = 0; j <= W; j++) {
                        if (i == 0 || j == 0) {
                                D[i][j] = 1;
                                continue;
                        }
                        D[i][j] = (long long)D[i-1][j] * (long long)B[j] % mod;
                        for(int k = 0; k < j; k++) {
                                long long tmp = D[i][j-k-1];
                                tmp *= D[i-1][k];
                                tmp %= mod;
                                tmp *= B[k];
                                tmp %= mod;
                                D[i][j] = (D[i][j] + tmp) % mod;
                        }
                }
        }
        printf("%d\n", D[H][W]);
        return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...