TAG
- 算法 − 【 D P − 分类讨论、 D P − c n t 】 算法 - 【DP - 分类讨论、DP - cnt】 算法−【DP−分类讨论、DP−cnt】时间复杂度
- O ( N ∗ K ) O(N \ast K) O(N∗K)
//
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 3005;
int dp[N][N]; // i 个人围成 j 个圈的本质不同的方案数
void solve() {
int n, k, p;
scanf("%lld%lld%lld", &n, &k, &p);
dp[3][1] = 2;
for (int i = 4; i <= n; i++) {
for (int j = 1; j <= k; j++) {
// (1) 第 i 个人加入已经存在的圈 dp[i - 1][j] * (i - 1)
// (2) 第 i 个人和其他两个人形成新的圈 dp[i - 3][j - 1] * C(i - 3, 2) * dp[3][1]
dp[i][j] = (dp[i - 1][j] * (i - 1) % p + dp[i - 3][j - 1] * (i - 1) % p * (i - 2) % p) % p;
}
}
printf("%lld\n", dp[n][k]);
}
signed main() {
int t = 1;
// scanf("%d", &t);
while (t--) solve();
return 0;
}
实现细节
- `
参考示意图
-
`
参考链接
- `
作者 | 乐意奥AI