学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!
附上汇总贴:小猴编程C++ | 汇总-CSDN博客
【题目描述】
n个格子排成1列,从左至右编号为1~n。他一开始站在第1个格子上,每次只能向右走若干格。但是小猴一次可以走的格子数x必须满足以下要求:
存在 1 ≤ i ≤ k 1\le i\le k 1≤i≤k,使得x满足 L i ≤ x ≤ R i L_i\le x\le R_i Li≤x≤Ri。
其中k是一个不超过10的正整数, [ L 1 , R 1 ] , [ L 2 , R 2 ] , … , [ L k , R k ] [L_1,R_1],[L_2,R_2],\dots,[L_k,R_k] [L1,R1],[L2,R2],…,[Lk,Rk]由输入给出。
例如 L 1 = 1 , R 1 = 1 , L 2 = 3 , R 2 = 4 L_1=1,R_1=1,L_2=3,R_2=4 L1=1,R1=1,L2=3,R2=4,那么小猴一次走的格子数只能是1,3,4中的某个数。
问:小猴要走到第n格,一共有多少种方法?(输出答案除以998244353的余数)
【输入】
第1行,2个正整数n,k
接下来k行,每行2个正整数 L i , R i L_i,R_i Li,Ri
【输出】
输出方法数除以998244353的余数
【输入样例】
5 2
1 1
3 4
【输出样例】
4
【代码详解】
#include <bits/stdc++.h>
using namespace std;
const int MR = 2e5+10;
const int MOD = 998244353;
typedef long long LL;
int n, k;
int L[15], R[15];
int s[MR], dp[MR];
int main()
{
cin >> n >> k;
for (int i=1; i<=k; i++) cin >> L[i] >> R[i];
dp[1] = s[1] = 1;
for (int i=2; i<=n; i++) {
for (int j=1; j<=k; j++) {
if (i-L[j]>=0) dp[i] += s[i-L[j]];
dp[i] %= MOD;
if (i-R[j]-1>=0) dp[i] -= s[i-R[j]-1];
dp[i] %= MOD;
}
s[i] = s[i-1] + dp[i];
s[i] %= MOD;
}
cout << (dp[n]+MOD)%MOD << endl;
return 0;
}
【运行结果】
5 2
1 1
3 4
4