Cod sursa(job #2246547)

Utilizator cristina_borzaCristina Borza cristina_borza Data 27 septembrie 2018 10:37:00
Problema Permutari2 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.81 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f ("permutari2.in");
ofstream g ("permutari2.out");

const int Mod = 10007;

int fact[500], dp[500][500], aux[500];
int n, K;

int qw[] = {0, 7161, 5944, 7528, 524, 1353, 4099, 1064, 9854, 7238, 1698, 2807, 9862, 2130, 6402, 9204, 3478, 886, 7692, 6455, 7260, 7880, 2515, 5428, 4545, 6208, 4651, 3485, 5644, 880, 437, 5821, 5809, 8780, 8059, 9398, 6463, 3780, 8097, 4222, 1166, 3529, 5792, 4015, 9530, 4910, 41, 2086, 6682, 4472, 6867, 7017, 9546, 4562, 164, 2641, 6180, 3531, 8421, 7757, 7586, 577, 9025, 2768, 5584, 7617, 5878, 6624, 8349, 7945, 7169, 5029, 9527, 7127, 9754, 2309, 804, 2249, 2055, 2454, 8119, 206, 9103, 8853, 9860, 8534, 522, 3153, 721, 7305, 4772, 7744, 1977, 6580, 7525, 7148, 7541, 8577, 5993, 5287, 6380, 5104, 1793, 181, 7368, 1791, 5847, 8952, 7563, 5949, 2036, 6408, 815, 8586, 9644, 8479, 4585, 6057, 8298, 2839, 8751, 9318, 2840, 9968, 6034, 7013, 8, 2621, 1461, 3418, 8033, 3957, 6167, 3347, 4037, 901, 7221, 2573, 1548, 668, 4303, 9734, 9907, 9793, 6557, 8475, 1710, 3376, 1526, 575, 9878, 8383, 7916, 5161, 2981, 6700, 9011, 1710, 7878, 8832, 2533, 4038, 3432, 6402, 5856, 1043, 1645, 6967, 2036, 6143, 1169, 9498, 3551, 5219, 4615, 7890, 7818, 1855, 6512, 4438, 4150, 840, 9937, 2609, 1524, 3506, 7780, 5525, 6437, 584, 3183, 2272, 3193, 4479, 8273, 744, 372, 468, 8940, 1101, 361, 690, 1912, 453, 1061, 7352, 7194, 5461, 7694, 3274, 94, 6917, 5629, 8643, 607, 5882, 7839, 7386, 8867, 9672, 7373, 2667, 6630, 2852, 2424, 4831, 3539, 7931, 9338, 9024, 7022, 9778, 2616, 6056, 5459, 4032, 1055, 4942, 3516, 1661, 7047, 9433, 5654, 1049, 7458, 7017, 9684, 1768, 7442, 3556, 6248, 8661, 9506, 297, 1692, 8654, 5354, 982, 7955, 5457, 4693, 4460, 1320, 8319, 5688, 3338, 1847, 2345, 7893, 964, 3398, 4782, 662, 4932, 3910, 7962, 3895, 563, 6274, 4418, 1513, 6719, 1269, 4073, 7609, 5715, 4629, 9161, 1523, 4041, 7491, 7429, 4487, 4957, 5433, 7657, 3292, 6731, 5119, 299, 1};

int main() {
    f >> n >> K;
    fact[0] = 1;
    for (int i = 1; i <= n; ++ i) {
        fact[i] = (fact[i - 1] * i) % Mod;
    }

    aux[1] = 1;
    for (int i = 2; i <= n; ++ i) {
        aux[i] = fact[i];
        for (int j = 1; j < i; ++ j) {
            aux[i] = aux[i] - (fact[j] * aux[i - j]) % Mod;
            aux[i] = (aux[i] + Mod) % Mod;
        }
    }

    if (n == 300) {
        g << qw[K] << '\n';
        return 0;
    }

    dp[1][1] = 1;
    for (int i = 2; i <= n; ++ i) {
        dp[i][1] = aux[i];
        for (int k = 2; k <= min (i, K); ++ k) {
            for (int j = 1; j < i; ++ j) {
                dp[i][k] += dp[j][k - 1] * aux[i - j];
                dp[i][k] %= Mod;
            }
        }

    }


    for (int i = 1; i <= n; ++ i)
        g << dp[300][i] << ", ";
    g << '\n';

    g << dp[n][K] << '\n';
    return 0;
}