题目描述
有N级的台阶,你一开始在底部,每次可以向上迈最多K级台阶(最少1级),问到达第N级台阶有多少种不同方式。
输入输出格式
输入格式:
输入文件的仅包含两个正整数N,K。
输出格式:
输入文件stair.out仅包括1个正整数,为不同方式数,由于答案可能很大,你需要输出mod 100003后的结果。
输入输出样例
输入样例#1:
5 2
输出样例#1:
8
说明
对于20%的数据,有N ≤ 10, K ≤ 3;
对于40%的数据,有N ≤ 1000;
对于100%的数据,有N ≤ 100000,K ≤ 100。
搜索强打表找规律
取余过程中出现负数加mod取余数可以避免
规律代码
#include<cstring>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include <iomanip>
using namespace std;
int n,k;
long long p[1000];
void bfs(int s)
{
if(s>20) return ;
p[s]++;
p[s]=p[s]%100003;
for(int i=1;i<=k;i++)
{
bfs(s+i);
}
}
int main()
{
while(cin>>k)
{
memset(p,0,sizeof(p));
bfs(0);
long long sum=0;
for(int i=1;i<20;i++)
{
cout<<setw(4)<<i<<setw(12)<<p[i]<<endl;
}
}
}
题解代码
#include<cstring>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
int n,k;
long long mod=100003;
long long p[100005];
int main()
{
p[0]=1;p[1]=1;
while(cin>>n>>k)
{
if(k==1)
{
cout<<"1"<<endl;
continue;
}
long long sum=2;
for(int i=2;i<k;i++)
{
p[i]=(p[i]+sum)%mod;
sum+=p[i];
// cout<<p[i]<<' '<<i<<endl;
}
//cout<<endl;
for(int i=k;i<=n;i++)
{
p[i]=(p[i]+sum)%mod;
sum=((sum+p[i]-p[i-k])+mod)%mod;
// cout<<p[i]<<' '<<i<<endl;
}
cout<<p[n]<<endl;
}
}