Pagini recente » Clasamentul arhivei educationale | Cod sursa (job #3293768) | Cod sursa (job #3291857) | Cod sursa (job #3291465) | Cod sursa (job #3289567)
#include <cstdint>
#include <iostream>
const int64_t NMAX = 2e2, MOD = 98999;
int64_t fastExp(int64_t a, int64_t b, const int64_t &MOD) {
int64_t ans = 1;
while (b > 0) {
if ((b & 1) == 1) {
ans = (ans * a) % MOD;
}
a = (a * a) % MOD;
b >>= 1;
}
return ans;
}
void precomputeComb(int64_t fact[], int64_t invFact[], const int64_t &n, const int64_t &MOD) {
int64_t i;
fact[0] = 1;
for (i = 1; i <= n; ++ i) {
fact[i] = (fact[i - 1] * i) % MOD;
}
invFact[n] = fastExp(fact[n], MOD - 2, MOD);
for (i = n - 1; i >= 0; -- i) {
invFact[i] = (invFact[i + 1] * (i + 1)) % MOD;
}
}
void precomputeStirlingFirstKind(int64_t stirling[NMAX + 1][NMAX + 1], const int64_t &n, const int64_t &MOD) {
int64_t i, j;
stirling[0][0] = 1;
for (i = 1; i <= n; ++ i) {
for (j = 1; j <= i; ++ j) {
stirling[i][j] = (((i - 1) * stirling[i - 1][j]) % MOD + stirling[i - 1][j - 1]) % MOD;
}
}
}
void precomputeStirlingSecondKind(int64_t stirling[NMAX + 1][NMAX + 1], const int64_t &n, const int64_t &MOD) {
int64_t i, j;
stirling[0][0] = 1;
for (i = 1; i <= n; ++ i) {
for (j = 1; j <= i; ++ j) {
stirling[i][j] = ((j * stirling[i - 1][j]) % MOD + stirling[i - 1][j - 1]) % MOD;
}
}
}
int64_t fact[NMAX + 1], invFact[NMAX + 1], stirlingFirst[NMAX + 1][NMAX + 1], stirlingSecond[NMAX + 1][NMAX + 1];
int64_t arang(const int64_t &n, const int64_t &k) {
if (k > n) {
return 0;
}
return (fact[n] * invFact[k]) % MOD;
}
int64_t comb(const int64_t &n, const int64_t &k) {
if (k > n) {
return 0;
}
return ((fact[n] * invFact[n - k]) % MOD * invFact[k]) % MOD;
}
int64_t stirlingFirstKind(const int64_t &n, const int64_t &k) {
if (k > n) {
return 0;
}
return stirlingFirst[n][k];
}
int64_t stirlingSecondKind(const int64_t &n, const int64_t &k) {
if (k > n) {
return 0;
}
return stirlingSecond[n][k];
}
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
freopen("stirling.in", "r", stdin);
freopen("stirling.out", "w", stdout);
precomputeComb(fact, invFact, NMAX, MOD);
precomputeStirlingFirstKind(stirlingFirst, NMAX, MOD);
precomputeStirlingSecondKind(stirlingSecond, NMAX, MOD);
int64_t tests, task, n, k;
std::cin >> tests;
for (; tests > 0; -- tests) {
std::cin >> task >> n >> k;
if (task == 1) {
std::cout << stirlingFirstKind(n, k) << '\n';
}
else {
std::cout << stirlingSecondKind(n, k) << '\n';
}
}
return 0;
}