Cod sursa(job #1654464)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 17 martie 2016 03:20:59
Problema Pavare2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.59 kb
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
int n,l,a,b,nr,np,i,j,ii,ok,d[110][2][110][50],z[3],v[50],x[50];
char s[50];
FILE *f,*g;
void ad(int a[],int b[]) {
    int t = 0;
    if(a[0] < b[0]) {
        for(int i = a[0] + 1; i <= b[0]; ++i)
            a[i] = 0;
        a[0] = b[0];
    }
    else{
        for (int i = b[0] + 1; i <= a[0]; ++i)
            b[i] = 0;
    }
    for (int i = 1; i <= a[0]; ++i) {
        a[i] = a[i] + b[i] + t;
        t = a[i] / 10;
        a[i] = a[i] % 10;
    }
    if (t)
        a[ ++a[0] ] = t;
}
int minim(int a,int b){
    if(a<b)
        return a;
    return b;
}
void scad(int a[],int b[]){
    int t=0;
    for(int i=1;i<=a[0];i++){
        a[i]  = a[i] - b[i] - t;
        if( a[i] < 0 ){
            t = 1;
            a[i] += 10;
        }
        else
            t = 0;
    }
    while( a[0] && a[ a[0] ] == 0 )
        a[0] --;
}
int cmp(int a[],int b[]){
    if( a[0] != b[0] )
        return a[0] > b[0];
    for(int i=a[0];i>=1;i--){
        if( a[i] != b[i] )
        return a[i] > b[i];
    }
    return 0;
}
int main(){
    f=fopen("pavare2.in","r");
    g=fopen("pavare2.out","w");
    fscanf(f,"%d%d%d\n%s",&n,&z[0],&z[1],s+1);
    l=strlen(s+1);
    v[0] = l;
    for( i = v[0],j=1; i>0; i--,j++ ){
        v[j] = s[i]-'0';
    }
    d[1][0][1][0] = d[1][0][1][1] = d[1][1][1][0] = d[1][1][1][1] = 1;
    for(i=2;i<=n;i++){
        for(j=0;j<2;j++){
            x[0] = 1;
            x[1] = 0;
            for(ii=1;ii<=z[ ( j + 1 ) % 2 ];ii++){
                ad( x, d[ i - 1 ][ ( j + 1 ) % 2 ][ii] );
            }
            ad( d[i][j][1], x );
            for(ii=2;ii<=z[j];ii++){
                ad( d[i][j][ii], d[ i - 1 ][j][ ii - 1 ] );
            }
        }
    }
    x[0] = 1;
    x[1] = 0;
    for(i=0;i<2;i++){
        for(j=1;j<=z[i];j++){
            ad( x , d[n][i][j] );
        }
    }
    for(i=x[0];i>=1;i--){
        fprintf(g,"%d",x[i]);
    }
    fprintf(g,"\n");
    np = -1;
    nr = 0;
    i = n;
    while(i){
        a = z[0];
        if( np == 0 )
            a -= nr;
        a = minim(i, a);
        ok = 0;
        if( np != 0 ){
            for(j=a;j>=1;j--){
                if( cmp( v , d[i][0][j] ) == 1 )
                    scad( v , d[i][0][j] );
                else{
                    i -= j;
                    for(ii=1;ii<=j;ii++){
                        fprintf(g,"0");
                    }
                    if(np == 0)
                        nr += j;
                    else
                        nr = j;
                    np = 0;
                    ok = 1;
                    break;
                }
            }
        }
        if( !ok ){
            a = z[1];
            if( np == 1 )
                a -= nr;
            a = minim(i, a);
            ok = 0;
            if( np != 1 ){
                for(j=1;j<=a;j++){
                    if( cmp( v , d[i][1][j] ) == 1 )
                        scad( v , d[i][1][j] );
                    else{
                        i -= j;
                        for(ii=1;ii<=j;ii++){
                            fprintf(g,"1");
                        }
                        if(np == 1)
                            nr += j;
                        else
                            nr = j;
                        np = 1;
                        ok = 1;
                        break;
                    }
                }
            }
        }
    }
    fclose(f);
    fclose(g);
    return 0;
}