Cod sursa(job #2307354)

Utilizator Anakin1001George Giorgiu Gica Anakin1001 Data 24 decembrie 2018 13:37:03
Problema Pavare2 Scor 55
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.72 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 c[]){
    int i=0,t=0;
    for(i=1;i<=a[0]||i<=b[0];i++){
        c[i]=a[i]-b[i]+t;
        if(c[i]<0){
            t=-1;
            c[i]=10+c[i];
        }
    }
    int j=1;
    while(c[j]==0)
        j++;
    c[0]=max(a[0],b[0])-(j-1);
    for(int l=j;l<=c[0];l++)
        c[l-j+1]=c[l];
}
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;
    for(i=max(a[0],b[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],v);
                ok=1;
            }
            else{
                j=x;
                while(comp(a[x][j],v)==-1&&j>1){
                    //k-=a[x][j];
                    dif(v,a[x][j],v);
                    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],v);
                ok=0;
            }
            else{
                j=1;
                while(comp(b[x][j],v)==-1&&j<n){
                    //k-=b[x][j];
                    dif(v,b[x][j],v);
                    j++;
                }
                ok=0;
                x=x-j;
                for(l=1;l<=j;l++)
                    g<<1;
            }
        }
    }
    return 0;
}