Cod sursa(job #276842)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 11 martie 2009 12:53:18
Problema Lista lui Andrei Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#define MAX 104659
#define Constanta 26

using namespace std;

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

long long mat[30][30];
long long sir[30];
long long rez[30][30];
int n,nr;

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

void mult(int n)
{
     if (n==1)
     {
          for (int i=0;i<Constanta;i++)
               for (int 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 (int i=0;i<Constanta;i++)
          for (int 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--;
     }
     mult(n-1);
     long long  S=0;
     for (int j=0;j<Constanta;j++)
     for (int i=0;i<Constanta;i++)
          S+=mat[j][i];
     fout<<S%MAX<<"\n";
     return 0;
}