Cod sursa(job #286253)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 23 martie 2009 17:00:37
Problema Lista lui Andrei Scor 100
Compilator cpp Status done
Runda qwerty-1 Marime 1.65 kb
#include <fstream>
#define MAX 104659
#define Constanta 26

using namespace std;

ifstream fin ("nrcuv.in");
ofstream fout ("nrcuv.out");

long long mat[50][50];
long long sir[50];
long long rez[50][50];
long long n,nr;

void inmultire(long long  mat[50][50],long long mat2[50][50])
{
     long long rez[50][50];
     memset(rez,0,sizeof(rez));
     for (long long i=0;i<Constanta;i++)
          for (long long j=0;j<Constanta;j++)
          {
               for (long long k=0;k<Constanta;k++)
                    rez[i][j]+=mat[i][k]*mat2[k][j];
          }
     for (long long i=0;i<Constanta;i++)
          for (long long j=0;j<Constanta;j++)
               mat[i][j]=rez[i][j]%MAX;
}

void mult(long long n)
{
     if (n==1)
     {
          for (long long i=0;i<Constanta;i++)
               for (long long j=0;j<Constanta;j++)
                    mat[i][j]=rez[i][j];
          return ;
     }
     if (n%2==0)
     {
          mult(n>>1);
          inmultire(mat,mat);
     }
     else
     {
          mult(n-1);
          inmultire(mat,rez);
     }
}

int main ()
{
     char c1,c2;
     fin>>n>>nr;
     for (long long i=0;i<Constanta;i++)
          for (long long j=0;j<Constanta;j++)
               rez[i][j]=1;
     while (nr)
     {
          fin>>c1>>c2;
          rez[c1-'a'][c2-'a']=0;
          rez[c2-'a'][c1-'a']=0;
          nr--;
     }
     if (n>1)
     {
          mult(n-1);
     long long  S=0;
     for (long long j=0;j<Constanta;j++)
     for (long long i=0;i<Constanta;i++)
          S+=mat[j][i];
     fout<<S%MAX<<"\n";
     }
     else
          fout<<26<<"\n";
     return 0;
}