#include <iostream>
using namespace std;
const int MAXN = 55;
int dp[MAXN][MAXN]; // dp[i][j]表示i划分成j个数的方案数
int dp2[MAXN][MAXN]; // dp2[i][j]表示i划分成j个不同正整数之和的方案数
int dp3[MAXN][MAXN]; // dp3[i][j]表示i划分成j个奇正整数之和的方案数
int main() {
// 预处理dp
for (int i = 1; i < MAXN; i++) {
dp[i][1] = 1; // i只能划分成一个数,方案数为1
for (int j = 2; j <= i; j++) {
dp[i][j] = dp[i-j][j] + dp[i-1][j-1]; // 递推
}
}
// 预处理dp2
for (int i = 1; i < MAXN; i++) {
dp2[i][1] = 1; // i只能划分成一个数,方案数为1
for (int j = 2; j <= i; j++) {
dp2[i][j] = dp2[i-j][j-1] + dp2[i-1][j-1]; // 递推
}
}
// 预处理dp3
for (int i = 1; i < MAXN; i++) {
dp3[i][1] = 1; // 只有一个奇数i,方案数为1
for (int j = 2; j <= i; j++) {
dp3[i][j] = dp3[i-j][j-1] + dp3[i-1][j-1]; // 递推
}
}
// 处理输入
int n, k;
while (cin >> n >> k) {
cout << dp[n][k] << endl; // 输出第一问答案
// 计算第二问答案(只需要在dp2的结果中减去dp的结果即可)
int ans2 = 0;
for (int i = 1; i <= k; i++) {
ans2 += dp2[n][i] - dp[n][i];
}
cout << ans2 << endl;
// 计算第三问答案(只需要在dp3的结果中减去dp2的结果即可)
int ans3 = 0;
for (int i = 1; i <= k; i++) {
ans3 += dp3[n][i] - dp2[n][i];
}
cout << ans3 << endl;
}
return 0;
}
|