Cod sursa(job #1168221)

Utilizator mvcl3Marian Iacob mvcl3 Data 7 aprilie 2014 15:28:49
Problema Lista lui Andrei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>
#include <cstring>

#define in "nrcuv.in"
#define out "nrcuv.out"
#define Alph_Size 26
#define Max_N 1003
#define Mod 104659

class Lista {
    protected :
        int N, M, DP[Max_N][Alph_Size + 3];
        bool Key[Alph_Size + 3][Alph_Size + 3];

    public  :
        void Read() {
            std :: ifstream f(in);
            char a, b;

            memset(Key, 0, sizeof(Key));
            memset(DP, 0, sizeof(DP));

            f >> N >> M;
            for(int i = 1; i <= M; ++i) {
                f >> a >> b;
                Key[a - 'a' + 1][b - 'a' + 1] = Key[b - 'a' + 1][a - 'a' + 1] = 1;
            }

            f.close();
        }

        int Solve()    {
            for(int i = 1; i <= Alph_Size; ++i)  DP[1][i] = 1;

            for(int i = 2; i <= N; ++i)
                for(int j = 1; j <= Alph_Size; ++j)
                    for(int k = 1; k <= Alph_Size; ++k)
                        if(!Key[j][k])  DP[i][j] = (DP[i][j] + DP[i - 1][k]) % Mod;

            int ans = 0;
            for(int i = 1; i <= Alph_Size; ++i)  ans = (ans + DP[N][i]) % Mod;

            return ans;
        }
};

int main()  {
    Lista obj;
    std :: ofstream g(out);

    obj.Read();
    g << obj.Solve() << '\n';

    g.close();
    return 0;
}