LL qpow(LL a, LL b, LL MOD){ LL ans = 1, base = a; while (b) { if (b & 1) ans = ans * base % MOD; b >>= 1, base = base * base % MOD; } return ans; }
voidadd(LL& a, LL b){ a = (a + b) % MOD; }
voidinit(){ for (int i = 0; i <= 300; i++) C[i][0] = 1; for (int i = 1; i <= 300; i++) for (int j = 1; j <= i; j++) C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % MOD; chainNum[1] = chainNum[2] = 1; for (int i = 3; i <= 300; i++) chainNum[i] = chainNum[i - 1] * i % MOD; cycleNum[2] = cycleNum[3] = 1; for (int i = 4; i <= 300; i++) cycleNum[i] = cycleNum[i - 1] * (i - 1) % MOD; }
intsolve(int n, int l, int m){ memset(dp, 0, sizeof(dp)); dp[0][0] = 1; for (int i = 1; i <= n; i++) for (int p = i - l; p <= i - 1; p++) { for (int chain = max(0, n - m - (n - p)); chain <= min(p, n - m); chain++) {//注意剩下 n - p 个点不可能构成超过 n - p 条链 add(dp[i][chain], dp[p][chain] * C[i - 1][i - p - 1] % MOD * cycleNum[i - p] % MOD); add(dp[i][chain + 1], dp[p][chain] * C[i - 1][i - p - 1] % MOD * chainNum[i - p] % MOD); } } return dp[n][n - m]; }
signedmain(){ init(); read(n, m, l); cout << ((solve(n, l, m) - solve(n, l - 1, m)) % MOD + MOD) % MOD; return0; }