藍橋 ALGO-3 K好數

*K好數

問題描述
如果一個自然數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 <= 10^6;
對於50%的數據,K <= 16, L <= 10;
對於100%的數據,1 <= K,L <= 100。

矩陣中,行代表1-L位自然數,列代表由列數數字開頭的情況,如:dp[i][j]則代表i位以j開頭的K好數數目。
首先判斷當前數字x是否爲j的相鄰數字,若不是,則根據當前數字的K好數的數目進行累加。

/*
	Name: 藍橋杯:K好數 
	Copyright: 拔劍四顧心茫然 
	Author: 拔劍四顧心茫然 
	Date: 20/03/14 18:50
	Description: dev-cpp 5.11 
*/
#include<iostream>
using namespace std;
#define mod 1000000007;

int main()
{
	long long int dp[120][120];
	long long int sum=0;
	int i,j,x,K,L;
	cin >> K >> L;
	for(i=0;i<K;i++)
		dp[1][i] = 1;
	for(i=2;i<=L;i++)
		for(j=0;j<K;j++)
			for(x=0;x<K;x++)
				if(x!=j-1 && x!=j+1)//判斷是否爲相鄰數字 
				{
					dp[i][j] += dp[i-1][x];//根據上一行的K好數個數累加 
					dp[i][j] %= mod;
				}
	for(i=1;i<K;i++)//0不能作爲首位數字  
	{
		sum += dp[L][i];
		sum %= mod;
	}
	cout << sum;
	return 0;
} 

一定要儘量申請更大空間,減少不必要的麻煩!!!

本文參考:雲筆記
本文參考:鍵盤上的舞者

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