题目描述

你有四个正整数 n,a,b,cn,a,b,cn,a,b,c,并准备用它们玩一个简单的小游戏。

在一轮游戏操作中,你可以选择将 nnn 减去 aaa,或是将 nnn 减去 bbb。游戏将会进行多轮操作,直到当 n≤cn \leq cnc 时游戏结束。

你想知道游戏结束时有多少种不同的游戏操作序列。两种游戏操作序列不同,当且仅当游戏操作轮数不同,或是某一轮游戏操作中,一种操作序列选择将 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=1n≤30n \leq 30n30
  • 40%40\%40% 的数据,c=1c = 1c=1n≤103n \leq 10^3n103
  • 对全部的测试数据,保证 1≤a,b,c≤n≤2×1051 \leq a,b,c \leq n \leq 2 \times 10^51a,b,cn2×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);
}


结果

在这里插入图片描述

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐