Cod sursa(job #1158857)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 29 martie 2014 10:10:24
Problema Permutari2 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <iostream>
#include <fstream>

using namespace std;

const int NMax = 310, KMax = 310, MOD = 10007;
int N, K;
int v[NMax], dp[NMax][KMax], fact[NMax], t[NMax];

void Read()
{
    ifstream f("permutari2.in");
    f >> N >> K;
    f.close();
}

void Solve()
{
    fact[0] = 1;
    for (int i = 1; i <= N; ++ i)
        fact[i] = fact[i-1] * i % MOD;
    t[1] = 1;
    for (int i = 2; i <= N; ++ i)
    {
        for (int j = 1; j < i; ++ j)
            t[i] = (t[i] + t[j] * fact[i-j]) % MOD;
        t[i] = fact[i] - t[i];
        t[i] = t[i] < 0 ? t[i] + MOD : t[i];
    }
    for (int i = 1; i <= N; ++ i)
        dp[i][1] = t[i], dp[i][i] = 1;
    for (int i = 2; i <= N; ++ i)
        for (int j = 2, lim = min(i-1, K); j <= lim; ++ j)
            for (int k = 1; k < i; ++ k)
                dp[i][j] = (dp[i][j] + dp[k][j-1] * t[i - k]) % MOD;
    ofstream g("permutari2.out");
    g << dp[N][K] << "\n";
    g.close();
}

int main()
{
    Read();
    Solve();
    return 0;
}