Cod sursa(job #808498)

Utilizator NikitaUtiuNichita Utiu NikitaUtiu Data 6 noiembrie 2012 20:23:04
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <fstream>
#include <algorithm>
using namespace std;

short m[2][500][200];

void add(short *a, short *b) {
    int i, t;
    for(i = 1, t = 0; i <= a[0] || i <= b[0] || t; t /= 10, ++i)
        a[i] = (t += (i <= a[0] ? a[i] : 0) + (i <= b[0] ? b[i] : 0)) % 10;
    a[0] = i - 1;
}

void assign(short *a, short *b) {
    a[0] = b[0];
    for(int i = 1; i <= b[0]; ++i)
        a[i] = b[i];
}

int main(void) {
    int n, d, k;
    ifstream fin("expozitie.in");
    fin >> n >> d >> k;
    fin.close();
    
    ofstream fout("expozitie.out");
    if(n - k * d < 0)
        fout << 0;
    else if(n - k * d == 0)
        fout << 1;
    else {
        int fl=0, sl=1;
        for(int i = 1, l = (n - k * d) + d - 1; i <= l; ++i, swap(fl, sl)) {
            m[sl][0][0] = m[sl][0][1] = 1;
            m[sl][i][0] = m[sl][i][1] = 1;
            for(int j = 1; j < i; ++j) {
                assign(m[sl][j], m[fl][j]);
                add(m[sl][j], m[fl][j-1]);
            }
        } 
        for(int i = m[fl][d-1][0]; i >= 1; --i)
            fout << m[fl][d-1][i];
    }
    fout.close();
}