题目描述
有 𝑁N 级台阶,你一开始在底部,每次可以向上迈 1∼𝐾1∼K 级台阶,问到达第 𝑁N 级台阶有多少种不同方式。
输入格式
两个正整数 𝑁,𝐾。
输出格式
一个正整数 𝑎𝑛𝑠(mod100003)ans(mod100003),为到达第 𝑁N 级台阶的不同方式数。
输入输出样例
输入
5 2
输出
8
说明/提示
- 对于 20%20% 的数据,1≤𝑁≤101≤N≤10,1≤𝐾≤31≤K≤3;
- 对于 40%40% 的数据,1≤𝑁≤10001≤N≤1000;
- 对于 100%100% 的数据,1≤𝑁≤1000001≤N≤100000,1≤𝐾≤1001≤K≤100。
递归法:
import java.util.Scanner;
public class TaiJieP {
public static void main(String[] args) {
//注意点 k>=n的讨论
//n == 2的讨论
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
System.out.println(min(n,k));
}
public static int min(int n, int k) {
int sum = 0;
//基准情况的讨论
if(n==0)return 1;
if(n<0)return 0;
else for(int i=1;i<=k;i++){
sum+=min(n-i,k);//遍历1~k阶的情况
}
return sum;
}
}
找规律:
我们观察到貌似有以下规律,
k=2 : 1 2 3 5 8 13 21 34...
k=3 : 1 2 4 7 13 24 44 81...
k=4 : 1 2 4 8 15 29 56 108...
k=5 : 1 2 4 8 16 31 61 120...
因此 我们可以得出啊以下递推公式:
规律:
当n<=k时,第N项=(上一项*2)%100003;
当n>k时 ,第N项=(上一项*2-第n-1-k项)%100003;
用程序表示就是
import java.util.Scanner;
public class Main {
static final int MOD = 100003;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int k = scanner.nextInt();
int[] a = new int[1000000];
int ans = 0;
a[0] = a[1] = 1;
for (int i = 2; i <= n; ++i) {
if (i <= k) {
a[i] = (a[i - 1] * 2) % MOD;
} else {
a[i] = (a[i - 1] * 2 - a[i - k - 1] + MOD) % MOD;
}
}
ans = (a[n] + MOD) % MOD;
System.out.println(ans);
}
}