Cod sursa(job #2308398)

Utilizator anamariatoaderAna Toader anamariatoader Data 27 decembrie 2018 00:14:35
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 fin("pavare2.in");
ofstream fout("pavare2.out");
int N,n,m,a[101][101][101],b[101][101][101],i,j,k[101],s[101];
bool ok;
char aux[101];
void tipar(int n){
    for(int i=1;i<=n;i++)
        fout<<ok;
}
void suma(int a[], int b[], int c[]){
    int i,t=0;
    for(i=1;i<=a[0] || i<=b[0];i++){
        c[i]=a[i]+b[i]+t;
        t=c[i]/10;
        c[i]%=10;
    }
    c[0]=i-1;
    if(t)
        c[++c[0]]=t;
}
void dif(int a[], int b[]){
    int i,t=0,d;
    for(i=b[0]+1;i<=a[0];i++)
        b[i]=0;
    for(i=1;i<=a[0];i++){
        d=a[i]-b[i]-t;
        if(d<0){
            d=d+10;
            t=1;
        }
        else
            t=0;
        a[i]=d;
    }
    while(!a[a[0]])
        a[0]--;
}
int cmp(int a[],int b[]){
    for(int i=0;i<=a[0];i++)
        if(a[i]<b[i])
            return -1;
        else if(a[i]>b[i])
            return 1;
    return 0;
}
void cpy(int a[],int b[]){
    for(int i=0;i<=b[0];i++)
        a[i]=b[i];
}
int main()
{
    fin>>N>>n>>m;
    fin.get();
    fin>>aux+1;
    k[0]=strlen(aux+1);
    for(i=1;i<=k[0];i++)
        k[k[0]-i+1]=aux[i]-'0';

    a[0][0][0]=a[0][0][1]=b[0][0][0]=b[0][0][1]=1;
    for(i=1;i<=N;i++){
        for(j=1;j<=n && j<=i;j++){
            cpy(a[i][j],b[i-j][0]);
            suma(a[i][0],a[i][j],a[i][0]);
        }
        for(j=1;j<=m && j<=i;j++){
            cpy(b[i][j],a[i-j][0]);
            suma(b[i][0],b[i][j],b[i][0]);
        }
    }
    suma(a[N][0],b[N][0],s);
    for(i=s[0];i>=1;i--)
        fout<<s[i];
    fout<<'\n';

    i=N;
    while(i){
        if(!ok){
            int x = cmp(a[i][0],k);
            if(x<0){
                dif(k,a[i][0]);
                ok=1;
            }
            else{
                for(j=min(i,n);j>=1;j--){
                    int x = cmp(a[i][j],k);
                    if(x<0)
                        dif(k,a[i][j]);
                    else{
                        tipar(j);
                        i-=j;
                        ok=1;
                        break;
                    }
                }
            }
        }
        else{
            int x = cmp(b[i][0],k);
            if(x<0){
                dif(k,b[i][0]);
                ok=0;
            }
            else{
                for(j=1;j<=m;j++){
                    int x = cmp(b[i][j],k);
                    if(x<0)
                        dif(k,b[i][j]);
                    else{
                        tipar(j);
                        i-=j;
                        ok=0;
                        break;
                    }
                }
            }
        }
    }
    return 0;
}