Cod sursa(job #2315639)

Utilizator Anakin1001George Giorgiu Gica Anakin1001 Data 10 ianuarie 2019 13:07:39
Problema Pavare2 Scor 55
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.77 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("pavare2.in");
ofstream g("pavare2.out");
int a[101][101][101],b[101][101][101],v[101];
int n,A,B,i,j,l,x,ok;
char S[102];
void dif(int a[],int b[]){
    int i=0,t=0,d;
    for(i=b[0]+1;i<=a[0];i++)
        b[i]=0;
    for(i=1;i<=a[0]||i<=b[0];i++){
        d=a[i]-b[i]+t;
        if(d<0){
            t=-1;
            d=10+d;
        }
        else
            t=0;
        a[i]=d;
    }
    while(!a[a[0]])
        a[0]--;
}
void suma(int a[],int b[],int c[]){
    int i=0,r=0;
    for(i=1;i<=a[0]||i<=b[0];i++){
        c[i]=a[i]+b[i]+r;
        r=c[i]/10;
        c[i]=c[i]%10;
    }
    c[0]=i-1;
    if(r!=0){
        c[0]=i;
        c[i]=r;
    }
}
int comp(int a[],int b[]){
    int i=0;
    if(a[0]>b[0])
        return 1;
    else if(a[0]<b[0])
        return -1;
    for(i=a[0];i>=1;i--)
        if(a[i]>b[i])
            return 1;
        else if(a[i]<b[i])
                return -1;
    return 0;
}
int main()
{   f>>n>>A>>B;
    a[0][0][1]=a[0][0][0]=1;
    b[0][0][1]=b[0][0][0]=1;
    for(i=1;i<=n;i++){
        for(j=1;j<=A&&j<=i;j++){
            a[i][j][0]=b[i-j][0][0];
            for(l=1;l<=b[i-j][0][0];l++)
                a[i][j][l]=b[i-j][0][l];
            suma(a[i][0],a[i][j],a[i][0]);
        }
        for(j=1;j<=B&&j<=i;j++){
            b[i][j][0]=a[i-j][0][0];
            for(l=1;l<=b[i-j][0][0];l++)
                b[i][j][l]=a[i-j][0][l];
            suma(b[i][0],b[i][j],b[i][0]);
        }
    }
    suma(a[n][0],b[n][0],v);
    for(i=v[0];i>=1;i--)
        g<<v[i];
    g<<'\n';
    f>>S+1;
    memset(v,0,sizeof(v));
    v[0]=strlen(S+1);
    for(i=1;i<=v[0];i++)
        v[i]=S[i]-'0';
    x=n;ok=0;
    while(x!=0){
        if(ok==0){
            if(comp(v,a[x][0])==1){
                //k-=a[x][0];
                dif(v,a[x][0]);
                ok=1;
            }
            else{
                j=x;
                while(comp(a[x][j],v)==-1&&j>1){
                    //k-=a[x][j];
                    dif(v,a[x][j]);
                    j--;
                }
                ok=1;
                x=x-j;
                for(l=1;l<=j;l++)
                    g<<0;
            }
        }
        else{
            if(comp(b[x][0],v)==-1){
                //k-=b[x][0];
                dif(v,b[x][0]);
                ok=0;
            }
            else{
                j=1;
                while(comp(b[x][j],v)==-1&&j<n){
                    //k-=b[x][j];
                    dif(v,b[x][j]);
                    j++;
                }
                ok=0;
                x=x-j;
                for(l=1;l<=j;l++)
                    g<<1;
            }
        }
    }
    return 0;
}