Cod sursa(job #180064)

Utilizator cretuMusina Rares cretu Data 16 aprilie 2008 16:43:36
Problema Pavare2 Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <fstream>
#define MAX 101

using namespace std;

int a[MAX][MAX][3][MAX], K[MAX];
int rez[MAX], v[3];
int n, A, B;

void sub(int X[], int Y[])
{
     int i, t = 0;
     for (i = 1; i <= X[0]; i++)
          X[i] += (t = (X[i] -= Y[i] + t) < 0) * 10;
     for (; X[0] > 1 && !X[X[0]]; X[0]--);
}

void add(int X[], int Y[])
{
     int i, t = 0;
     for (i = 1; i <= X[0] || i <= Y[0] || t; i++, t/=10)
          X[i] = (t += X[i] + Y[i]) % 10;
     X[0] = i - 1;
}

int cmp(int X[], int Y[])
{
     int i;
     if (X[0] > Y[0]) return 1;
     if (Y[0] > X[0]) return -1;
     
     for (i = X[0]; i >= 1; i--)
     {
         if (X[i] > Y[i]) return 1;
         if (Y[i] > X[i]) return -1;  
     }
     return 0;
}

ofstream fout("pavare2.out");

void Write(int X[])
{
    for (int i = X[0]; i > 0; i--)
        fout << X[i];
    fout << "\n";
}

void Rec(int n)
{
    if (n <= 0) return;   
    int j, ok = 0; 
    for (j = 1; j <= A && cmp(a[n][j][0], K) != -1;  j++)
    {
        ok = 1;
        fout << 0;    
        if (j == n) return;     
    }
    if (!ok) sub(K, a[n][1][0]);
    else     sub(K, a[n-j][j][0]);
    
    fout << 1;
    
    if (!ok) sub(K, a[n][1][1]);
    else     sub(K, a[n-j][1][1]);
    Rec(n-j);
}

int main()
{
    int i, j, k;
    string s;
    
    ifstream fin("pavare2.in");
    fin >> n >> A >> B;
    fin >> s;
    K[0] = s.length();
    for (i = K[0]-1, j = 1; i >= 0; i--, j++)
        K[j] = s[i]-'0';
    fin.close();
            
    for (i = 1; i <= n; i++)   
    {
        a[i][i][0][0] = a[i][i][0][1] = 1;
        a[i][i][1][0] = a[i][i][1][1] = 1;
        for (j = 1; j <= A && j < i; j++)
        {
             a[i][j][0][0] = 1;
             for (k = 1; k <= B && k <= i-j; k++)
                  add(a[i][j][0], a[i-j][k][1]);
        }
        for (j = 1; j <= B && j <= i; j++)
        {
            a[i][j][1][0] = 1;
            for (k = 1; k <= A && k <= i-j; k++)
                 add(a[i][j][1], a[i-j][k][0]);
        }
    }
    
    rez[0] = 1;
    
    for (i = 1; i <= A; i++)
        add(rez, a[n][i][0]);
    for (i = 1; i <= B; i++)
        add(rez, a[n][i][1]);
        
    for (i = rez[0]; i >= 1; i--)
       fout << rez[i];
    fout << "\n";
    
    Rec(n);
    
    fout.close();
    
    return 0;
}