Cod sursa(job #2667077)

Utilizator ptlsebiptl sebi ptlsebi Data 2 noiembrie 2020 20:18:24
Problema Lista lui Andrei Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <stdio.h>
#include <stdint.h>

typedef uint8_t u_int8_t;
typedef uint32_t u_int32_t;

#define M 104659

void read_u_int32_t(FILE *stream, u_int32_t *nr) {
    *nr = 0;
    u_int8_t ch;
    while ((ch = fgetc(stream)) && ('0' <= ch && ch <= '9')) {
        *nr *= 10;
        *nr += ch - '0';
    }
}

void getchars(FILE *stream, u_int8_t *ch1, u_int8_t *ch2) {
    *ch1 = fgetc(stream);
    fgetc(stream);
    *ch2 = fgetc(stream);
    fgetc(stream);
}

u_int8_t rules[27][27];
u_int32_t mem[1001][27];

int main() {
    u_int32_t n, m;
    u_int8_t ch1, ch2;
    {
        FILE *in = fopen("nrcuv.in", "r");

        read_u_int32_t(in, &n);
        read_u_int32_t(in, &m);

        {
            int32_t i;
            for (i = 0; i < m; ++i) {
                getchars(in, &ch1, &ch2);
                ch1 -= 'a';
                ch2 -= 'a';
                rules[ch1][ch2] = 1;
                rules[ch2][ch1] = 1;
            }
        }
        fclose(in);
    }
    {
        int32_t i;
        for (i = 0; i < 26; ++i) {
            mem[1][i] = 1;
        }
    }
    {
        int32_t i, j, k;
        for (i = 2; i <= n; ++i) {
            for (j = 0; j < 26; ++j) {
                for (k = 0; k < 26; ++k) {
                    if (rules[j][k] == 0) {
                        mem[i][j] += mem[i - 1][k];
                        mem[i][j] %= M;
                    }
                }
            }
        }
    }
    u_int32_t res = 0;
    {
        int32_t i;
        for (i = 0; i < 26; ++i) {
            res += mem[n][i];
            res %= M;
        }
    }

    {
        FILE *out = fopen("nrcuv.out", "w");

        fprintf(out, "%u", res);

        fclose(out);
    }

    return 0;
}