Cod sursa(job #2370238)

Utilizator AntoniuFicAntoniu Ficard AntoniuFic Data 6 martie 2019 11:18:00
Problema Lista lui Andrei Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#define MOD 104659
using namespace std;

int n, m;

unsigned long long a[26][26], part[26][26];

void inmultire(unsigned long long a[][26], unsigned long long b[][26]){
    unsigned long long rez[26][26];
    for(int i=0; i<26; i++){
     for(int j=0; j<26; j++){
         rez[i][j] = 0;
         for(int k=0; k<26; k++)
             rez[i][j] =(rez[i][j] + (a[i][k] * b[k][j]) % MOD) % MOD;
     }
    }
    for(int i=0; i<26; i++)
        for(int j=0; j<26; j++)
            a[i][j] = rez[i][j];
    return;
}

void putere(){
    n--;
    while(n>1){
        if(n%2){
            inmultire(a, part);
            n--;
        }
        inmultire(a, a);
        n/=2;
    }
}

int main() {
    ifstream f("nrcuv.in");
    ofstream g("nrcuv.out");
    f>>n>>m;
    for(int i=0; i<26; i++)
        for(int j=0; j<26; j++)
            a[i][j] = part[i][j] = 1;
    for(int i=0; i<m; i++)
    {
        char c, b;
        f>>c>>b;
        a[(int)(c-'a')][(int)(b-'a')] = part[(int)(c-'a')][(int)(b-'a')] = 0;
        a[(int)(b-'a')][(int)(c-'a')] = part[(int)(b-'a')][(int)(c-'a')] = 0;
    }
    putere();
    unsigned long long suma = 0;
    for(int i=0; i<26; i++)
        for(int j=0; j<26; j++)
            suma=(a[i][j] + suma) % MOD;
    g<<suma;
    return 0;
}