This is a dynamic programming problem, dynamic transfer equation is:
$$ans=\sum^{k}_{j=1}{f_{(i-j)}} (f_{0}=1)$$
***
- Memory search
`` `Cpp
#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 100005
#define mod 100003
int n,k;
int bin[MAX];
int f(int i){
if (i == 0) return 1; // I 0 when 0 is returned directly
if (bin [i]) return bin [i]% mod; // if previously pushed through f (i), and call it directly bin [i]
for (int j = 1; j <= k && ij> = 0; ++ j) bin [i] = (bin [i]% mod + f (ij)% mod)% mod; // can not be pushed through do it again
return bin[i]%mod;
}
int main () {
scanf("%d%d",&n,&k);
printf ( "% d \ n", f (n)% mod); // finally have to look%
return 0;
}
```
290ms, 7200KB
- an array of recursive
`` `Cpp
#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 100005
#define mod 100003
int n,k;
int f[MAX];
int main () {
scanf("%d%d",&n,&k);
f[0]=1;
for(int i=1;i<=n;++i)
for(int j=1;j<=k&&i-j>=0;++j)
f[i]=(f[i]%mod+f[i-j]%mod)%mod;
printf("%d\n",f[n]%mod);
return 0;
}
```
220ms, 944KB
~ ~ ~ ~ Fast or array
The time complexity of O (nk)
$$ans=\sum^{k}_{j=1}{f_{(i-j)}} (f_{0}=f_{1}=1)$$ *** - 记忆化搜索 ```cpp#include<iostream>#include<cstdio>using namespace std;#define MAX 100005#define mod 100003int n,k;int bin[MAX];int f(int x){if(x==1||x==0)return 1;if(bin[x])return bin[x]%mod;for(int i=1;i<=k&&x-i>=0;++i)bin[x]=(bin[x]%mod+f(x-i)%mod)%mod;return bin[x]%mod;}int main(){scanf("%d%d",&n,&k);printf("%d\n",f(n)%mod);return 0;}``` - 数组递推