Cod sursa(job #1993629)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 23 iunie 2017 13:56:40
Problema Permutari2 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream fin ("permutari2.in"); ofstream fout ("permutari2.out");

const int nmax = 300;
const int mod = 10007;

int e[nmax + 1], fact[nmax + 1];
int d[ 2 ][nmax + 1];

int main() {
    int n, p;
    fin >> n >> p;

    fact[ 0 ] = 1;
    for (int i = 1; i <= n; ++ i) fact[ i ] = fact[i - 1] * i % mod;

    e[ 1 ] = 1;
    for (int i = 2; i <= n; ++ i) {
        e[ i ] = fact[ i ];
        for (int j = 1; j < i; ++ j) {
            e[ i ] -= e[ j ] * fact[i - j] % mod;
            if (e[ i ] < 0) e[ i ] += mod;
        }
    }

    d[ 0 ][ 0 ] = 1;
    int ind = 1;

    for (int i = 1; i <= p; ++ i, ind = 1 - ind) {
        memset(d[ ind ], 0, sizeof(d[ ind ]));

        for (int j = i; j <= n; ++ j) {
            for (int k = 0; k < j; ++ k) {
                d[ ind ][ j ] = (d[ ind ][ j ] + d[1 - ind][ k ] * e[j - k]) % mod;
            }
        }
    }

    fout << d[1 - ind][ n ] << "\n";

    fin.close();
    fout.close();
    return 0;
}