藍橋杯 演算法訓練 K好數(Java解題)

mcp3128發表於2018-02-12

問題描述

如果一個自然數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。

解析:此題用動態規劃思想進行求解。

陣列a[i][j]表示第i位放置數字j的時候k好數的數量,將0到k-1這k個數的a[i][j]相加所得結果即為最後k好數的數量。

a[i][j] = ∑a[i-1][u] (u != j±1 ,0<=u < k, i > 1)初始化a[1][j]= 1 (0<= j < k);

程式碼:

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		int k, l;
		int a[][] = new int[101][101];
		Scanner x = new Scanner(System.in);
		k = x.nextInt();
		l = x.nextInt();
		for (int j = 0; j < k; j++)
			a[1][j] = 1;
		for (int i = 2; i <= l; i++) {
			for (int j = 0; j < k; j++) {
				for (int u = 0; u < k; u++) {
					if (u != j - 1 && u != j + 1) {
						a[i][j] += a[i - 1][u];
						a[i][j] %= 1000000007;
					}
				}
			}
		}
		int sum = 0;
		for (int u = 1; u < k; u++) {
			sum += a[l][u];
			sum %= 1000000007;
		}
		System.out.println(sum);
	}

}

 

相關文章