Cod sursa(job #2456096)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 13 septembrie 2019 17:24:57
Problema Sate2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 2.94 kb
#include <fstream>
using namespace std;
ifstream f("sate2.in");
ofstream g("sate2.out");
int primes[] = {2, 3, 5, 7, 11, 13};
int N, M, K;
int A[3005];
int DP3[15][15][15];
int DP2[15][15];
int Tmp[15][15];
int Tmp3[15][15][15];
void Read(){
    f >> N >> M >> K;
    for(int i = 1; i <= N; i++)
        f >> A[i];
}

bool solveK3(int prime){
    for(int i = 0; i < prime; i++)
        for(int j = 0; j < prime; j++)
            DP2[i][j] = 0;
    DP2[0][0] = 1;

    for(int i = 1; i <= N; i++){
        for(int j = 0; j < prime; j++)
            for(int k = 0; k < prime; k++)
                Tmp[j][k] = DP2[j][k];
        for(int j = 0; j < prime; j++)
            for(int k = 0; k < prime; k++){
                int a = j + A[i];
                if(a >= prime)
                    a -= prime;
                int b = k + A[i];
                if(b >= prime)
                    b -= prime;
                if(DP2[j][k])
                    Tmp[a][k] = 1, Tmp[j][b] = 1;
            }
        for(int j = 0; j < prime; j++)
            for(int k = 0; k < prime; k++)
                DP2[j][k] = Tmp[j][k];
    }
    return DP2[(M / 3) % prime][(M / 3) % prime];
}

bool solveK4(int prime){
    for(int i = 0; i < prime; i++)
        for(int j = 0; j < prime; j++)
            for(int k = 0; k < prime; k++)
                DP3[i][j][k]= 0;
    DP3[0][0][0] = 1;

    for(int i = 1; i <= N; i++){
        for(int j = 0; j < prime; j++)
            for(int k = 0; k < prime; k++)
                for(int p = 0; p < prime; p++)
                    Tmp3[j][k][p] = DP3[j][k][p];
        for(int j = 0; j < prime; j++)
            for(int k = 0; k < prime; k++)
                for(int p = 0; p < prime; p++){
                int a = j + A[i];
                if(a >= prime)
                    a -= prime;
                int b = k + A[i];
                if(b >= prime)
                    b -= prime;
                int c = p + A[i];
                if(c >= prime)
                    c -= prime;
                if(DP3[j][k][p])
                    Tmp3[a][k][p] = 1, Tmp3[j][b][p] = 1, Tmp3[j][k][c] = 1;
            }
        for(int j = 0; j < prime; j++)
            for(int k = 0; k < prime; k++)
                for(int p = 0; p < prime; p++)
                    DP3[j][k][p] = Tmp3[j][k][p];
    }
    return DP3[(M / 4) % prime][(M / 4) % prime][(M / 4) % prime];
}

void Solve(){
    if(M % K != 0){
        g << "NU\n";
        return;
    }
    if(K == 3){
        for(int i = 0; i < 6; i++)
        if(solveK3(primes[i]) == 0){
            g << "NU\n";
            return;
        }
        g << "DA\n";
        return;
    }
    for(int i = 0; i < 6; i++)
        if(solveK4(primes[i]) == 0){
            g << "NU\n";
            return;
        }
        g << "DA\n";
}
int main()
{
    int T;
    f >> T;
    while(T--){
        Read();
        Solve();
    }
    return 0;
}