SW练习

    技术2026-08-22  11

    import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; /** 我们用f数组记录跳到每个台阶的方式总数,其中f[0]=1; 要跳到第一级台阶只能从底部直接跳,所以跳到第一级台阶的方式总数f[1]=f[0]=1; 要跳到第二级台阶能从底部直接跳或从第一级台阶往上跳,所以跳到第二级台阶的方式总数f[2]=f[0]+f[1]=1+1=2(这里约定k>2); 由此我们可以得出f[i]=f[0]+f[1]+...+fi-1(把i=k的情况放到后面去亦可); 要跳到第(k+1)级台阶可以从第1级至第k级出发;要跳到第(k+2)级台阶可以从第2级至第(k+1)级出发; 因此我们可以得到跳到第i级台阶可以从第(i-k)级至第(i-1)级出发,f[i]=f[i-k]+f[i-k+1]+...+fi-1. */ public class Main { static int[] fn; static int MOD=100003; public static void main(String[] args) throws Exception{ BufferedReader reader=new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st=new StringTokenizer(reader.readLine()); int N=Integer.parseInt(st.nextToken()); int K=Integer.parseInt(st.nextToken());//每次最多可以跨越的台阶数 if(K==1){ System.out.println(1); return; } fn=new int[N+1]; fn[0]=1; fn[1]=1; for (int i = 2; i <K ; i++) { for (int j = 0; j <i ; j++) { fn[i]=(fn[i]+fn[j])%MOD; } } for (int i=K;i<=N;i++) {//第二种分类 for (int j = i - K; j < i; j++) { fn[i] = (fn[i] + fn[j]) % MOD; } } System.out.printf("%d\n",fn[N]); reader.close(); } }

     

    Processed: 0.013, SQL: 9