Cod sursa(job #127595)

Utilizator info_arrandrei gigea info_arr Data 24 ianuarie 2008 17:32:51
Problema Reuniune Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <fstream>

#define FIN "vecini.in"
#define FOUT "reuniune.out"
#define BAS 10000000

typedef struct 
{
        int n;
        int d[150];
} bignum;

bignum ant1, ant2;
bignum N1, N2;

int N, i;

void add(bignum &a, bignum b, bignum c)   
{   
      int i, t = 0;
      a.n = 0;
      memset (a.d, 0, sizeof (a.d));   
      for (i=1; i<=b.n || i<=c.n || t; i++, t/=BAS)   
              a.d[i] = (t += b.d[i] + c.d[i]) % BAS;   
      a.n = i - 1;   
}

void shl(bignum &a)   
{   
      int i, t = 0;   
      for (i = 1; i <= a.n || t; i++, t /= BAS)   
              a.d[i] = (t += a.d[i] * 2) % BAS;   
      a.n = i - 1;   
}   

void atr (bignum &a, bignum b)
{
     a.n = b.n;
     memcpy (a.d, b.d, sizeof (b.d));
}   

int main ()
{
    freopen (FIN, "r", stdin);
    freopen (FOUT, "w", stdout);
    
  //  scanf ("%d", &N);
    N = 2000;
          
    ant1.n = ant2.n = 1;
    ant1.d[1] = ant2.d[1] = 1;
    
    for (i = 2; i <= N; ++i)
    {
                add (N1, ant1, ant2);
                shl (ant1);
                add (N2, ant1, ant2);                
                atr (ant1, N1);
                atr (ant2, N2);
    }          
    shl (ant1);
    add (N1, ant1, ant2);
    printf ("%d", N1.d[N1.n]);
    for (i = N1.n - 1; i; --i)
        printf ("%07d", N1.d[i]);
    
    return 0;
}