Cod sursa(job #2307386)

Utilizator anamariatoaderAna Toader anamariatoader Data 24 decembrie 2018 14:49:57
Problema Pavare2 Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("pavare2.in");
ofstream fout("pavare2.out");
int N,n,m,i,j;
bool ok;
int a[105][105][105],b[105][105][105],c[105],k[105],l,s[105],t,d[105]={4,1,2,3,4},x[105]={2,2,5};
char aux[105];
void cpy(int a[], int b[]){
    memset(a,0,sizeof(a));
    a[0]=b[0];
    for(int i=1;i<=a[0];i++)
        a[i]=b[i];
}
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;
        c[i]%=10;
        t/=10;
    }
    c[0]=i-1;
    if(t!=0)
        c[++c[0]]=t;
}
void dif(int a[], int b[]){
    int i,t=0;
    for(i=b[0]+1;i<=a[0];i++)
        b[i]=0;
    for(i=1;i<=a[0];i++){
        a[i]=a[i]-(b[i]+t);
        if(a[i]<0)
            t=1;
        else
            t=0;
        if(t!=0)
            a[i]+=10;
    }
    while(a[a[0]]==0)
        a[0]--;
}
int cmp(int a[], int b[]){
    int i;
    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()
{
    fin>>N>>n>>m;
    fin.get();
    fin.getline(aux+1,100);
    for(i=1;aux[i]!=0;i++)
        k[i]=aux[i];
    k[0]=strlen(aux+1);
    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],c);
    for(i=c[0];i>=1;i--)
        fout<<c[i];
    fout<<'\n';
    ok=0;
    l=N;
    while(l!=0){
        if(ok==0){
            if(cmp(k,a[l][0])>0){
                dif(k,a[l][0]);
                ok=1;
            }
            else{
                for(j=n;j>=1;j--)
                    if(cmp(k,a[l][j])>0)
                        dif(k,a[l][j]);
                    else{
                        tipar(j);
                        l-=j;
                        ok=1;
                        break;
                    }
            }
        }
        else{
            if(cmp(k,b[l][0])>0){
                dif(k,b[l][0]);
                ok=0;
            }
            else{
                for(j=1;j<=m;j++)
                    if(cmp(k,b[l][j])>0)
                        dif(k,b[l][j]);
                    else{
                        tipar(j);
                        l-=j;
                        ok=0;
                        break;
                    }
            }
        }
    }
    return 0;
}