用C语言写:题目描述 酒神沐白,一生好饮。幸好他从不开车。一天,他提着酒壶,从家里出来,酒壶中有酒 2 斗。他边走边唱:无事街上走,提壶去打酒。逢店加一倍,遇花喝一斗。这一路上,他一共遇到店 N 次,遇到花 M 次。已知最后一次遇到的是花, 他正好把酒喝光了。请你计算沐白这一路遇到店和花的顺序,有多少种不同的可能?注意:壶里没酒 ( 0 斗) 时遇店是合法的,加倍后还是没酒;但是没酒时遇花是不合法的。 输入输出格式 输入格式 第一行包含两个整数 N 和 M,每个整数用一个空格隔开。 输出格式 输出一个整数表示答案。由于答案可能很大,输出模 1000000007 的结果。 输入输出样例1 输入 5 10 输出 14
时间: 2023-05-11 13:05:04 浏览: 97
这是一道组合数学的题目,可以使用动态规划来解决。
定义状态 dp[i][j] 表示遇到 i 个店,j 个花时的方案数。
转移方程为:
dp[i][j] = (dp[i-1][j] + dp[i][j-1]) * i (遇到店的情况) + dp[i-1][j] * (j-1) (遇到花的情况)
边界条件为 dp[0][0] = 1,dp[i][0] = dp[0][i] = 0。
最终答案为 dp[N-1][M]。
以下是 C 语言代码实现:
#include <stdio.h>
#define MOD 1000000007
int main() {
int N, M;
scanf("%d %d", &N, &M);
int dp[N][M+1];
for (int i = 0; i < N; i++) {
for (int j = 0; j <= M; j++) {
if (i == 0 && j == 0) {
dp[i][j] = 1;
} else if (i == 0) {
dp[i][j] = 0;
} else if (j == 0) {
dp[i][j] = dp[i-1][j] * i % MOD;
} else {
dp[i][j] = (dp[i-1][j] + dp[i][j-1]) * i % MOD;
dp[i][j] = (dp[i][j] + dp[i-1][j] * (j-1) % MOD) % MOD;
}
}
}
printf("%d\n", dp[N-1][M]);
return 0;
}
阅读全文