专栏文章
P1192 台阶问题 题解
P1192题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minr39e2
- 此快照首次捕获于
- 2025/12/02 06:58 3 个月前
- 此快照最后确认于
- 2025/12/02 06:58 3 个月前
P1192 台阶问题 题解
CPP
#include <cstdio>//知识涉及:同余 递归 记忆化搜索
#define mod 100003
int dp[1000010];
int f(int n,int k){
dp[1] = dp[0] = 1;
for(int i = 2;i <= n;i++){
if(i <= k) dp[i] = (dp[i-1]*2)%mod;//同余
else dp[i] = (dp[i-1]*2 - dp[i-k-1]) % mod;
}
return (dp[n]+mod)%mod;//防止负数 -- 同余
}
int main(){
int n,k;
scanf("%d%d",&n,&k);
printf("%d",f(n,k));
return 0;
}
/*f函数公式的推导:
dp[x] = dp[x-1]+dp[x-2]+...+dp[x-k]
dp[x-1] = dp[x-2]+dp[x-3]+...+dp[x-k-1]
我们发现,变成了公差为2的等差数列
所以 在x<=k时:dp[x] = (2*dp[x-1])%mod
若x > k:
dp[x] = dp[x-1]*2-dp[x-k-1]
dp[x-k-1] --> 首项
因为若x<=k时 x-k-1<=0
*/
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...