AC鸭和AK鸭比赛跳台阶。
台阶共有 n 级,其中每级都有对应的宽度 wi 和 高度 hi 。AC鸭每次能跳的最大宽度为 W,高度为 H。当相邻几级台阶的宽度总和和高度总和不大于AC鸭跳跃距离限制时,AC鸭就可以一次跳上多级台阶。
AC鸭想知道,它共有多少种跳法跳上第 n 级台阶。
第一行输入三个整数 n,W,H 表示台阶级数,AC鸭能够跳跃的最大宽度与高度。
接下来 n 行,每行输入一个台阶的宽度和高度 wi ,hi .
输出AC鸭跳上第 n 级台阶的总方案数。如果它跳不上去,输出 0 由于答案可能会很大,输出答案对 998244353 取模后的结果。
5 5 5
1 2
2 1
2 2
2 2
1 1
12
#include<iostream>
using namespace std;
const long long mod=998244353;
long long a[500010]={0,1,2,4},W,H,n,w[500010],h[500010];
int main(){
cin>>n>>W>>H;
for(long long i=1;i<=n;i++){
cin>>w[i]>>h[i];
}
if(n<=3){
cout<<a[n]<<endl;
return 0;
}
for(long long i=4;i<=n;i++){
long long x1=0,x2=0;
for(long long j=1;j<=i;j++)
x1+=w[i],x2+=h[i];
long long X=min(x1/i,x2/i);
for(long long j=1;j<=X;j++){
if(i>=j){
a[i]=(a[i]+a[i-j]%mod);
}
}
}
cout<<a[n]<<endl;
return 0;
}
1<=n,H,W,hi,wi<=10^9
测试点没有0的情况,我就省略啦