Cod sursa(job #179873)

Utilizator cretuMusina Rares cretu Data 16 aprilie 2008 13:44:25
Problema Pavare2 Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 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 Rec(int n, int x)
{
     if (n <= 0) return;    
     int j, ok = 0; 
     for (j = 1; j <= A && j <= n && cmp(a[n][j][0], K) != -1; j++)
     {
         ok = 1;
         fout << 0;         
     }
         
     if (cmp(a[n][j][0], K) != 1) 
     {
        sub(K, a[n][j][0]);
        if (n-j > 0) fout << 1;
        Rec(n-j, x);
     }
     else 
     {
        if (n-1 > 0)fout << 1;
        Rec(n-1, x); 
     }
}

int main()
{
    int i, j, k;
    string s;
    
    ifstream fin("pavare2.in");
    fin >> n >> A >> B;
    fin >> s;
    v[0] = A, v[1] = B;
    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, 0);
    
    fout.close();
    
    return 0;
}