#include <stdio.h>

#define LOADI 53
#define LOAD 92
#define ADD 56
#define JEQ 90
#define HALT 69
#define MUL 77
#define JNEQ 15
#define EQ 44
#define JMP 22
#define STORE 89

int I[] = {
    53, 3, 1,
    53, 4, 0,
    53, 5, 17,
    53, 6, 17,
    53, 7, 33,
    53, 8, 0,
    92, 0, 4,
    77, 0, 4,
    92, 2, 5,
    44, 0, 2,
    56, 4, 3,
    56, 5, 3,
    15, 48, 0,
    44, 4, 6,
    90, 54, 0,
    22, 18, 0,
    89, 7, 8,
    69, 0, 0,
    89, 7, 3,
    69, 0, 0,
};

int E = 0;
int R[10];
int M[100];
int V[] = {0, 4, 6, 0, 6, 0, 0, 5, 6, 3, 0, 5, 6, 9, 2, 5};

int C(char *serial)
{
    int i, j;
    for (i = 0; i < 10; i++) {
        R[i] = 0;
    }
    for (i = 0; i < 16; i++) {
        M[i] = (serial[i] - '0') % 48;
    }
    for (i = 17, j = 0; i < 33; i++, j++) {
        M[i] = V[j];
    }
    M[33] = 0;
    
    i = 0;
    for (;;) {
        //printf("%d ", i);
        switch (I[i]) {
            case LOADI:
                //printf("LOADI R[%d] <- %d\n", I[i+1], I[i+2]);
                R[I[i+1]] = I[i+2];
                i += 3;
                break;
            case LOAD:
                //printf("LOAD R[%d] <- M[%d]=(%d)\n", I[i+1], R[I[i+2]], M[R[I[i+2]]]);
                R[I[i+1]] = M[R[I[i+2]]];
                i += 3;
                break;
            case STORE:
                //printf("STORE M[%d] <- R[%d]=%d\n", R[I[i+1]], I[i+2], R[I[i+2]]);
                M[R[I[i+1]]] = R[I[i+2]];
                i += 3;
                break;
            case ADD:
                //printf("ADD R[%d] <- R[%d]=%d\n", I[i+1], I[i+2], R[I[i+2]]);
                R[I[i+1]] = R[I[i+1]] + R[I[i+2]];
                i += 3;
                break;
            case MUL:
                //printf("MUL R[%d] <- R[%d]=%d\n", I[i+1], I[i+2], R[I[i+2]]);
                R[I[i+1]] = (R[I[i+1]] * R[I[i+2]]) % 10;
                i += 3;
                break;
            case EQ:
                //printf("EQ R[%d]=%d R[%d]=%d\n", I[i+1], R[I[i+1]], I[i+2], R[I[i+2]]);
                if (R[I[i+1]] == R[I[i+2]]) {
                    E = 1;
                } else {
                    E = 0;
                }
                i += 3;
                break;
            case JEQ:
                //printf("JEQ %d E=%d\n", I[i+1], E);
                if (E) {
                    i = I[i+1];
                } else {
                    i += 3;
                }
                break;
            case JNEQ:
                //printf("JNEQ %d E=%d\n", I[i+1], E);
                if (!E) {
                    i = I[i+1];
                } else {
                    i += 3;
                }
                break;
            case JMP:
                //printf("JMP %d\n", I[i+1]);
                i = I[i+1];
                break;
            case HALT:
                //printf("HALT\n");
                goto end;
                break;
        }
    }

end:
    if (M[33] == 1)
        return 1;
    return 0;
}

int main(int argc, char **argv)
{
    if (argc != 2) {
        return 1;
    }
    if (C(argv[1])) {
        printf("Numero de serie valido / Valid serial number :-)\n");
        return 0;
    } else {
        printf("Numero de serie no valido / Invalid serial number :-(\n");
        return 1;
    }
}