✏️ 纠错
第 43 题 / 共 155 题
题目描述
你有四个正整数 n,a,b,c,并准备用它们玩一个简单的小游戏。
在一轮游戏操作中,你可以选择将 n 减去 a,或是将 n 减去 b。游戏将会进行多轮操作,直到当 n≤c 时游戏结束。
你想知道游戏结束时有多少种不同的游戏操作序列。两种游戏操作序列不同,当且仅当游戏操作轮数不同,或是某一轮游戏操作中,一种操作序列选择将 n 减去 a,而另一种操作序列选择将 n 减去 b。如果 a=b,也认为将 n 减去 a 与将 n 减去 b 是不同的操作。
由于答案可能很大,你只需要求出答案对 10^9+7 取模的结果。
输入格式
一行四个整数 n,a,b,c。
输出格式
输出一行一个整数表示答案。
输入输出样例
输入 #1
1 1 1 1
输出 #1
1
输入 #2
114 51 4 1
输出 #2
176
输入 #3
114514 191 9 810
输出 #3
384178446
说明/提示
数据规模与约定
- 对 20% 的数据,a=b=c=1,n≤30。
- 对 40% 的数据,c=1,n≤10^3。
- 对全部的测试数据,保证 1≤a,b,c≤n≤2×10^5。
你真棒!
📝 题目解析
【题目大意】给定一个数n,每次操作可以减去a或者b,最后使得结果小于等于c,问不同的操作的序列个数。
【考纲知识点】一维动态规划
【解题思路】可以定义f[i]为在游戏中出现i这个数字时不同的操作序列个数。有:
递推式:f[i] = f[i+a] + f[i+b]。
边界条件:f[n] = 1。
答案:f[c] + f[c-1] + f[c-2] + ... + f[c-b+1]。
由于答案中的下标可能会出现负数,在代码实现时可以将数组改为map或者将数组下标整体调大(可以看一下参考程序,参考程序中的f[N+i]可以和思路内的f[i]对应)
【参考程序】