给个明确的思路,小学生级别的那种。题目描述 酒神沐白,一生好饮。幸好他从不开车。一天,他提着酒壶,从家里出来,酒壶中有酒 2 斗。他边走边唱:无事街上走,提壶去打酒。逢店加一倍,遇花喝一斗。这一路上,他一共遇到店 N 次,遇到花 M 次。已知最后一次遇到的是花, 他正好把酒喝光了。请你计算沐白这一路遇到店和花的顺序,有多少种不同的可能?注意:壶里没酒 ( 0 斗) 时遇店是合法的,加倍后还是没酒;但是没酒时遇花是不合法的。 输入输出格式 输入格式 第一行包含两个整数 N 和 M,每个整数用一个空格隔开。 输出格式 输出一个整数表示答案。由于答案可能很大,输出模 1000000007 的结果。 输入输出样例1 输入 5 10 输出 14
时间: 2023-05-11 07:05:09 浏览: 181
题目分析:
这道题可以使用递归的方法来解决,每次递归时有两种情况,遇到店或遇到花。如果遇到店,酒的数量乘以2,店的数量减1;如果遇到花,酒的数量减1,花的数量减1。当酒的数量为0时,如果最后一次遇到的是花,则说明这是一种合法的情况,否则不合法。
代码实现:
注意要取模,防止答案溢出。
C++ 代码
```cpp
#include <iostream>
using namespace std;
const int MOD = 1e9 + 7;
int dfs(int n, int m, int k, int cnt, int flag) {
if (k == 0) {
return flag ? cnt + 1 : cnt;
}
int res = 0;
if (flag) {
res = (res + dfs(n, m - 1, k - 1, cnt, 0)) % MOD;
}
if (n > 0) {
res = (res + dfs(n - 1, m, k - 1, cnt + 1, 1)) % MOD;
}
return res;
}
int main() {
int n, m;
cin >> n >> m;
cout << dfs(n, m, n + m, 0, 1) << endl;
return 0;
}
```
Python 代码
```python
MOD = 10 ** 9 + 7
def dfs(n, m, k, cnt, flag):
if k == 0:
return cnt + flag
res = 0
if flag:
res = (res + dfs(n, m - 1, k - 1, cnt, 0)) % MOD
if n > 0:
res = (res + dfs(n - 1, m, k - 1, cnt + 1, 1)) % MOD
return res
n, m = map(int, input().split())
print(dfs(n, m, n + m, 0, 1))
```
Lua 代码
```lua
local MOD = 1e9 + 7
local function dfs(n, m, k, cnt, flag)
if k == 0 then
return cnt + flag
end
local res = 0
if flag == 1 then
res = (res + dfs(n, m - 1, k - 1, cnt, 0)) % MOD
end
if n > 0 then
res = (res + dfs(n - 1, m, k - 1, cnt + 1, 1)) % MOD
end
return res
end
local n, m = io.read("*n", "*n")
print(dfs(n, m, n + m, 0, 1))
```
阅读全文