Cod sursa(job #2024640)

Utilizator Vlad3108Tir Vlad Ioan Vlad3108 Data 20 septembrie 2017 22:38:27
Problema Nunta Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.99 kb
/**
    Copyright (C) 2017 Tir Vlad Ioan
*/
#ifndef BIGNUMBERS_H_INCLUDED
#define BIGNUMBERS_H_INCLUDED
#include <cstdio>
#include <cstring>
#define LMAX 305
#define Copy(A,B) memcpy(A,B,sizeof(B))
#define Set(A) memset(A,0,sizeof(A))
using namespace std;
typedef int Huge[LMAX];
inline void Read(Huge &A){
    char x[LMAX];
    scanf("%s",x);
    A[0]=strlen(x);
    for(int i=1;i<=A[0];++i)
        A[i]=x[A[0]-i]-'0';
}
inline void Atrib(Huge &A,int x){
    Set(A);
    if(!x) A[++A[0]]=0;
    while(x){
        A[++A[0]]=x%10;
        x/=10;
    }
}
inline void Write(Huge A){
    for(int i=A[0];i;--i)
        printf("%d",A[i]);
    printf("\n");
}
inline void Swap(Huge &A,Huge &B){
    Huge aux;
    Copy(aux,A);
    Copy(A,B);
    Copy(B,aux);
}
inline short Cmp(Huge A,Huge B){
    if(A[0]<B[0]) return +1;
    else if(A[0]>B[0]) return -1;
    for(int i=A[0];i;--i)
        if(A[i]<B[i]) return +1;
        else if(A[i]>B[i]) return -1;
    return 0;
}
inline void SumMic(Huge &A,int r){
    int i;
    for(i=1;i<=A[0]||r;++i){
        int aux=r+A[i];
        A[i]=aux%10;
        r=aux/10;
    }
    A[0]=i-1;
}
inline void SumMare(Huge A,Huge B,Huge &C){
    Set(C);
    int i,r=0;
    for(i=1;i<=A[0]||i<=B[0]||r;++i){
        int aux=r+A[i]+B[i];
        C[i]=aux%10;
        r=aux/10;
    }
    C[0]=i-1;
}
inline void ProdMic(Huge &A,int x){
    int i,r=0;
    for(i=1;i<=A[0]||r;++i){
        int aux=r+A[i]*x;
        A[i]=aux%10;
        r=aux/10;
    }
    A[0]=i-1;
}
inline void ProdMare(Huge A,Huge B,Huge &C){
    Set(C);
    int i,r=0;
    C[0]=A[0]+B[0]-1;
    for(int i=1;i<=A[0];++i)
        for(int j=1;j<=B[0];++j)
            C[i+j-1]+=A[i]*B[j];
    for(i=1;i<=C[0]||r;++i){
        int aux=r+C[i];
        C[i]=aux%10;
        r=aux/10;
    }
    C[0]=i-1;
}
inline void Dif(Huge A,Huge B,Huge &C){
    Set(C);
    int r=0;
    C[0]=A[0];
    for(int i=1;i<=A[0];++i){
        int aux=r+A[i]-B[i];
        if(aux>=0) C[i]=aux,r=0;
        else C[i]=aux+10,r=-1;
    }
    while(!C[C[0]]&&C[0]>1) --C[0];
}
inline void DivMic(Huge &A,int x,int &r){
    int aux;r=0;
    for(int i=A[0];i;--i){
        aux=r*10+A[i];
        A[i]=aux/x;
        r=aux%x;
    }
    while(!A[A[0]]&&A[0]>1) --A[0];
}
inline void DivMare(Huge &A,Huge B,Huge &C,Huge &R){
    Copy(R,A);Atrib(C,0);
    while(Cmp(R,B)!=1){
        Huge aux;
        Dif(R,B,aux);
        Copy(R,aux);
        SumMic(C,1);
    }
}
inline void Pow(Huge &A,int x){
    Huge P;Copy(P,A);Atrib(A,1);
    for(int i=1;i<=x;++i){
        Huge aux;
        ProdMare(A,P,aux);
        Copy(A,aux);
    }
}
#endif // BIGNUMBERS_H_INCLUDED
using namespace std;
int main(){
    freopen("nunta.in","r",stdin);
    freopen("nunta.out","w",stdout);
    Huge A,B,C;
    Atrib(A,1);Atrib(B,1);
    int n;
    scanf("%d",&n);
    for(int i=2;i<=n;++i){
        SumMare(A,B,C);
        Copy(A,B);
        Copy(B,C);
    }
    Write(B);
    return 0;
}