Cod sursa(job #1158899)

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

using namespace std;

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

int main()
{
    freopen("permutari2.in", "r", stdin);
    scanf("%d %d", &N, &K);
    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];
    }
    freopen("permutari2.out", "w", stdout);
    printf("%d\n", dp[N][K]);
    return 0;
}