专栏文章

P1192 台阶问题 题解

P1192题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minr39e2
此快照首次捕获于
2025/12/02 06:58
3 个月前
此快照最后确认于
2025/12/02 06:58
3 个月前
查看原文

P1192 台阶问题 题解

都在代码里
Ps:请不要复制粘贴QwQPs:请不要复制粘贴QwQ
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 条评论,欢迎与作者交流。

正在加载评论...