1. 程式人生 > >藍橋杯演算法訓練-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 <= 106;

對於50%的資料,K <= 16, L <= 10;

對於100%的資料,1 <= K,L <= 100。

解題思路

動態規劃的思想,對於第一位,我們的dp[1][num]=1,dp[1][num] 表示第1位取num時我們的k好數的個數,對於d[i][j]我們只要求出一個x滿足x!=j-1&&x!=j+1那麼dp[i][j]+=dp[i-1][x]即可。

最後我們累加dp[l][0:k-1]即可求出最終的結果。

解題程式碼

#include <iostream>
#include <algorithm>
#define rep(i,s,e) for(int i = s;i<e;i++)
using namespace std;
const int maxn = 100010;
const long long mod = 1000000007;
int getKnum(){
    int l,k;
    cin>>k>>l;
    long long dp[105][105];
    rep(i,0,k) dp[1][i] = 1;
    for(int i = 2;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]%=mod;
                }
            }
        }
    }
    long long ans = 0;
    rep(i,1,k){
        ans+=dp[l][i];
        ans%=mod;
    }
    cout<<ans<<endl;
}
int main()
{
    getKnum();
}

相關推薦

藍橋演算法訓練-k

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

藍橋 演算法訓練 K JAVA

import java.util.Scanner; class Main{ static int MOD=1000000007 ; public static void main(String[] args) { Scanner sc = new Scanne

藍橋演算法訓練 k

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

演算法訓練 K 藍橋

對於30%的資料,KL <= 106; 對於50%的資料,K <= 16, L <= 10; 對於100%的資料,1 <= K,L <= 100。 本身想用搜索,然後資料太大了,看了提示,要用動態規劃。 也不能算典型的動態規劃,因為不存在最優子結構,只是用了重複利用

藍橋 ALGO-3 演算法訓練 K (動態規劃 DP)

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

藍橋ALGO-3 K(dp)

問題描述 如果一個自然數N的K進製表示中任意的相鄰的兩位都不是相鄰的數字,那麼我們就說這個數是K好數。求L位K進位制數中K好數的數目。例如K = 4,L = 2的時候,所有K好數為11、13、20、

藍橋 ALGO-3 K(數位DP)

解題方案:dp,在分析問題的時候可以發現每次都要計算的重複子問題:i位數以數字j為首的有多少個。 #include <iostream> #include <cstdio>

藍橋 演算法訓練 迴文

  若一個數(首位不為零)從左向右讀與從右向左讀都一樣,我們就將其稱之為迴文數。  例如:給定一個10進位制數56,將56加65(即把56從右向左讀),得到121是一個迴文數。  又如:對於10進位制數87:  STEP1:87+78 = 165 STEP2:165+561

藍橋 演算法訓練 區間k大數查詢

明明是一個水題卻wrong answer了很多遍。。 還是因為對最基礎的氣泡排序概念不清。蠢死算了。 這下終於搞清楚了。 問題描述 給定一個序列,每次詢問序列中第l個數到第r個數中第K大的數是哪個。 輸入格式 第一行包含一個數

藍橋-演算法訓練-區間k大數查詢

演算法訓練 區間k大數查詢 問題描述 給定一個序列,每次詢問序列中第l個數到第r個數中第K大的數是哪個。 輸入格式 第一行包含一個數n,表示序列長度。 第二行包含n個正整數,表示給定的序列。 第三個包含一個正整數m,

藍橋 演算法訓練 區間K大數查詢 冒泡法排序重溫

對於30%的資料,n,m<=100; 對於100%的資料,n,m<=1000; 保證k<=(r-l+1),序列中的數<=106。 這道題的難度不大,但是由於基礎不牢固,沒有很好地領悟冒泡法排序,一開始寫得並不到位。下面首先是正確的程式碼: #include<stdio

算法訓練 K

ati n) i++ read sum static amr tint body 問題描述 如果一個自然數N的K進制表示中任意的相鄰的兩位都不是相鄰的數字,那麽我們就說這個數是K好數。求L位K進制數中K好數的數目。例如K = 4,L = 2的時候,所有K好數為11、13、

藍橋 演算法訓練 字母圖形

問題描述 利用字母可以組成一些美麗的圖形,下面給出了一個例子: ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC 這是一個5行7列的圖形,請找出這個圖形的規律,並輸出一個n行m列的圖形。 輸入格式 輸入一行

藍橋-演算法訓練 未名湖邊的煩惱 (遞迴)

 演算法訓練 未名湖邊的煩惱   時間限制:1.0s   記憶體限制:256.0MB      問題描述   每年冬天,北大

[藍橋][演算法訓練VIP]猴子分蘋果

題目描述 秋天到了,n只猴子採摘了一大堆蘋果放到山洞裡,約定第二天平分。這些猴子很崇拜猴王孫悟空,所以都想給他留一些蘋果。第一隻猴子悄悄來到山洞,把蘋果平均分成n份,把剩下的m個蘋果吃了,然後藏起來一份,最後把剩下的蘋果重新合在一起。這些猴子依次悄悄來到山洞,都做同樣的操作,恰好每次

藍橋演算法訓練 最大最小公倍數

時間限制:1.0s   記憶體限制:256.0MB 問題描述 已知一個正整數N,問從1~N-1中任選出三個數,他們的最小公倍數最大可以為多少。 輸入格式 輸入一個正整數N。 輸出格式 輸出一個整數,表示你找到的最小公倍數。 樣例輸入 9 樣例輸出

藍橋 演算法訓練 ALGO-81 動態陣列使用

演算法訓練 動態陣列使用 時間限制:1.0s 記憶體限制:512.0MB 從鍵盤讀入n個整數,使用動態陣列儲存所讀入的整數,並計算它們的和與平均值分別輸出。要求儘可能使用函式實現程式程式碼。平均值為小數的只保留其整數部分。 樣例輸入: 5 3 4 0 0 2 樣例輸出: 9 1 樣例

藍橋 演算法訓練 ALGO-122 未名湖邊的煩惱 遞迴 遞推

演算法訓練 未名湖邊的煩惱 時間限制:1.0s 記憶體限制:256.0MB 問題描述   每年冬天,北大未名湖上都是滑冰的好地方。北大體育組準備了許多冰鞋,可是人太多了,每天下午收工後,常常一雙冰鞋都不剩。   每天早上,租鞋視窗都會排起長龍,假設有還鞋的m個,有需要租鞋的n個。現在

藍橋 演算法訓練 ALGO-116 最大的算式 動態規劃 資源分配型別(最大乘積)

演算法訓練 最大的算式 時間限制:1.0s 記憶體限制:256.0MB 問題描述   題目很簡單,給出N個數字,不改變它們的相對位置,在中間加入K個乘號和N-K-1個加號,(括號隨便加)使最終結果儘量大。因為乘號和加號一共就是N-1個了,所以恰好每兩個相鄰數字之間都有一個符號。例如: