洛谷 P10376 [GESP202403 六级] 游戏-普及-
·
题目描述
你有四个正整数 n,a,b,cn,a,b,cn,a,b,c,并准备用它们玩一个简单的小游戏。
在一轮游戏操作中,你可以选择将 nnn 减去 aaa,或是将 nnn 减去 bbb。游戏将会进行多轮操作,直到当 n≤cn \leq cn≤c 时游戏结束。
你想知道游戏结束时有多少种不同的游戏操作序列。两种游戏操作序列不同,当且仅当游戏操作轮数不同,或是某一轮游戏操作中,一种操作序列选择将 nnn 减去 aaa,而另一种操作序列选择将 nnn 减去 bbb。如果 a=ba=ba=b,也认为将 nnn 减去 aaa 与将 nnn 减去 bbb 是不同的操作。
由于答案可能很大,你只需要求出答案对 109+710^9 + 7109+7 取模的结果。
输入格式
一行四个整数 n,a,b,cn,a,b,cn,a,b,c。
输出格式
输出一行一个整数表示答案。
输入输出样例 #1
输入 #1
1 1 1 1
输出 #1
1
输入输出样例 #2
输入 #2
114 51 4 1
输出 #2
176
输入输出样例 #3
输入 #3
114514 191 9 810
输出 #3
384178446
说明/提示
数据规模与约定
- 对 20%20\%20% 的数据,a=b=c=1a=b=c=1a=b=c=1,n≤30n \leq 30n≤30。
- 对 40%40\%40% 的数据,c=1c = 1c=1,n≤103n \leq 10^3n≤103。
- 对全部的测试数据,保证 1≤a,b,c≤n≤2×1051 \leq a,b,c \leq n \leq 2 \times 10^51≤a,b,c≤n≤2×105。
solution
简单的动态规划,f[x] = f[x - a] + f[x - b]
代码
#include <iostream>
#include "bit"
#include "vector"
#include "unordered_set"
#include "set"
#include "queue"
#include "algorithm"
#include "bitset"
using namespace std;
const int N = 2e5 + 2;
int n, a, b, c, f[N], M = 1e9 + 7;
int ff(int x) {
if (x <= c) return 1;
if(f[x]) return f[x];
return f[x] = (ff(x - a) + ff(x - b)) % M;
}
int main() {
cin >> n >> a >> b >> c;
cout << ff(n);
}
结果

更多推荐

所有评论(0)