藍橋杯-K好數

flag

藍橋杯第13天

題目介紹

問題描述
如果一個自然數N的K進製表示中任意的相鄰的兩位都不是相鄰的數字,那麼我們就說這個數是K好數。求L位K進制數中K好數的數目。例如K = 4,L = 2的時候,所有K好數爲11、13、20、22、30、31、33 共7個。由於這個數目很大,請你輸出它對1000000007取模後的值。

輸入格式
輸入包含兩個正整數,K和L。

輸出格式
輸出一個整數,表示答案對1000000007取模後的值。
樣例輸入
4 2
樣例輸出
7
數據規模與約定
對於30%的數據,KL <= 106;

對於50%的數據,K <= 16, L <= 10;

對於100%的數據,1 <= K,L <= 100。

思路

首先要仔細讀題,然後把題中給的例子自己算出來一次。
比如題中給的是二位四進制數,我們可以拓展到三位四進制,畫一個樹狀圖:
在這裏插入圖片描述
發現可以用動態規劃的思路,從左到右一位一位依次計算。
採用一個二維數組dp,L行K列,(i,j)保存i位時以j開頭的結果個數。

1
所以:7 = 2 + 2 + 3

代碼


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        int K=input.nextInt();
        int L=input.nextInt();

        long[][]dp=new long[L][K];
        for(int i=0;i<K;i++){//第一行都初始化爲1
            dp[0][i]=1;
        }

        for(int i=1;i<L;i++){
            for(int j=0;j<K;j++){
                for(int x=0;x<K;x++){
                    if(x!=j-1&&x!=j+1){
                        dp[i][j]+=dp[i-1][x];
                        dp[i][j]%=1000000007;
                    }
                }
            }
        }

        long sum=0;
        for(int i=1;i<K;i++){
            sum+=dp[L-1][i];
            sum%=1000000007;
        }
        System.out.println(sum);


    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章