Cod sursa(job #1158895)

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

using namespace std;

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

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

void Solve()
{
    fact[0] = 1;
    for (register int i = 1; i <= N; ++ i)
        fact[i] = fact[i-1] * i % MOD;
    t[1] = 1;
//    for (register int i = 2; i <= N; ++ i)
//    {
//        for (register 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 (register int i = 1; i <= N; ++ i)
        dp[i][i] = 1;
    for (register int i = 2; i <= N; ++ i)
    {
        for (register int j = 1; j < i; ++ j)
        {
            t[i] += t[j] * fact[i - j];
            if (j > K)
                continue;

            register long long sum = 0;
            for (int k = 1; k < i; ++ k)
                sum += dp[k][j-1] * t[i - k];
            dp[i][j] = sum % MOD;
        }
        t[i] %= MOD;
        t[i] = fact[i] - t[i];
        t[i] = t[i] < 0 ? t[i] + MOD : t[i];
        dp[i][1] = t[i];
    }
    ofstream g("permutari2.out");
    g << dp[N][K] << "\n";
    g.close();
}

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