Cod sursa(job #66835)

Utilizator floringh06Florin Ghesu floringh06 Data 21 iunie 2007 13:11:27
Problema Lista lui Andrei Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
using namespace std;

#define MAX_N 1005
#define MAX_L 30
#define max(a,b) ((a)>(b)?(a):(b))
#define BAZA 1000000

#include <stdio.h>
#include <fstream>

FILE *fin=fopen("nrcuv.in","r"),
     *fout=fopen("nrcuv.out","w");

typedef struct 
 {
  int n;
  int x[20];
 } bignum; 
     
int i,j,n,m,k;
char c1,c2;
bignum v[MAX_N][MAX_L];
int o[MAX_L][MAX_L];
bignum sol;

void add(bignum &a, bignum b)
{
  int i,t=0;
  a.n=max(a.n,b.n);
  for (i=1; i<=a.n; i++) 
   { a.x[i]=(t+=a.x[i]+b.x[i])%BAZA; t/=BAZA; }
  if (t>0) a.x[++a.n]=t; 
}   
     
int main()
{
   fscanf(fin,"%d %d\n",&n,&m);
   memset(o,0,sizeof(o));
   memset(sol.x,0,sizeof(sol.x));   
   for (i=1; i<=m; i++) {
    fscanf(fin,"%c %c\n",&c1,&c2);
    j=c1-96; k=c2-96;
    o[j][k]=1; o[k][j]=1;
   }
   for (j=1; j<=26; j++)
     {v[1][j].n=1; v[1][j].x[1]=1; }
   for (i=1; i<=n; i++)
    for (j=1; j<=26; j++) 
     for (k=1; k<=26; k++)
      if (o[j][k]==0 && o[k][j]==0) add(v[i][j],v[i-1][k]);  
   sol.n=0; 
   for (i=1; i<=26; i++)
    add(sol,v[n][i]);
   fprintf(fout,"%d",sol.x[sol.n]); 
   for (i=sol.n-1; i>=1; i--)
     fprintf(fout,"%06d",sol.x[i]);
   fprintf(fout,"\n");  
     
   fclose(fin); fclose(fout);
   
   return 0;
}