Cod sursa(job #836767)

Utilizator stoicatheoFlirk Navok stoicatheo Data 16 decembrie 2012 18:31:58
Problema Pavare2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.03 kb
#include<stdio.h>
#include<string.h>
 
#define lg 105
 
int n, a, b, K[lg], d[lg][lg][2][lg], i, j, sol[lg], trc[lg], s, rsp[lg], p;
char sir[lg];
 
void add(int a[], int b[]){
    int i, p = 0;
 
    for (i = 1; i <= a[0] || i <= b[0] || p; i ++, p /= 10)
        a[i] = (p += a[i] + b[i]) % 10;
    a[0] = i-1;
}
void sub(int a[], int b[]){
    int i, p = 0;
 
    for (i = 1; i <= a[0]; i ++)
        a[i] += (p = (a[i] -= b[i] + p) < 0) * 10;
    for (; !a[a[0]]; a[0] --);
}
int cmp(int a[], int b[]){
    int i;
    if (a[0] < b[0])
        return -1;
    if (a[0] > b[0])
        return 1;
 
    for (i = a[0]; i; i --){
        if (a[i] < b[i])
            return -1;
        if (a[i] > b[i])
            return 1;
    }
    return -1;
}
void afis(int a[]){
    for (int i = 1; i <= a[0]; i ++)
        printf("%d", a[i]);
    printf("\n");
}
 
int main()
{
    freopen("pavare2.in", "rt", stdin);
    freopen("pavare2.out", "wt", stdout);
 
    scanf("%d%d%d\n%s", &n, &a, &b, sir);
 
    int xx = strlen(sir);
    for (i = xx-1; i >= 0; i --)
        K[++ K[0]] = sir[i] - '0';
 
    d[1][1][0][0] = d[1][1][0][1] = 1;
    d[1][1][1][0] = d[1][1][1][1] = 1;
    for (i = 1; i < n; i ++)
        for (j = 1; j <= a || j <= b; j ++){
            if (j <= a){
                if (j < a)
                    add(d[i+1][j+1][0], d[i][j][0]);
                add(d[i+1][1][1], d[i][j][0]);
            }
            if (j <= b){
                if (j < b)
                    add(d[i+1][j+1][1], d[i][j][1]);
                add(d[i+1][1][0], d[i][j][1]);
            }
        }
    for (i = 1; i <= a || i <= b; i ++){
        if (i <= a)
            add(sol, d[n][i][0]);
        if (i <= b)
            add(sol, d[n][i][1]);
    }
    for (i = sol[0]; i; i --)
        printf("%d", sol[i]);
    printf("\n");
     
    //naspa de acum
    //afis(d[n][a][0]);
 
    p = n+1; int pct = -1;
    while (p > 1){
        memset(sol, 0, sizeof(sol)); memset(trc, 0, sizeof(trc)); s = 0;
 
        if (pct == 0 || pct == -1)
            for (i = a; i; i --){
                add(sol, d[p-1][i][0]);
                if (cmp(K, sol) == -1){
                    s = 1;
                    p -= i;
                    sub(K, trc); pct = 1;
                    break;
                }
                else
                    add(trc, d[p-1][i][0]);
            }
        if (s)
            continue;
         
        if (pct == 1 || pct == -1)
            for (i = 1; i <= b; i ++){
                add(sol, d[p-1][i][1]);
                if (cmp(K, sol) == -1){
                    s = 1;
                    for (j = p-1; j >= p-i; j --)
                    rsp[j] = 1;
                    p -= i;
                    sub(K, trc); pct = 0;
                    break;
                }
                else
                    add(trc, d[p-1][i][1]);
            }   
        //afis(K);
    }
 
    for (i = n; i; i --)
        printf("%d", rsp[i]);
    printf("\n");
 
    return 0;
}