Cod sursa(job #179338)

Utilizator cretuMusina Rares cretu Data 15 aprilie 2008 20:11:17
Problema Pavare2 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <fstream>
#define MAX 101

using namespace std;

int a[MAX][MAX][3][MAX], K[MAX];
int rez[MAX];
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 main()
{
    int i, j, k, t, p;
    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]);
        }
    }
    
    ofstream fout("pavare2.out");
    
    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";
    
    j = 0;
    for (i = 1; i <= n; i++)
        if (j < A) { fout << "0"; j++; }
        else       { fout << "1"; j = 0; }
    
    fout.close();
    
    return 0;
}