藍橋杯 K好數

  算法訓練 K好數  
時間限制:1.0s   內存限制:256.0MB
      
問題描述

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

http://lx.lanqiao.cn/problem.page?gpid=T13

不用講DP  剛一開始還沒有想到   遞推每增加一位  以多少(K進制內)結尾的情況有多少

最後把他們加在一起就OK了

 

#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
int dp[110][110];
int main(void)
{
    int k,l,i,j,h;
    while(scanf("%d %d",&k,&l)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        if(l==1)
        {
            printf("0\n");
            continue;
        }
        for(i=0; i<k; i++)
            dp[1][i]=1;
        dp[1][0]=0;
        for(i=2; i<=l; i++) //多少位
            for(j=0; j<k; j++)//以j結尾的幾種情況
            {
                for(h=0; h<k; h++)
                    if(abs(h-j)!=1)
                    {
                        dp[i][j]+=dp[i-1][h];
                        dp[i][j]%=mod;
                    }
            }
        int sum=0;
        for(i=0; i<k; i++)
        {
            sum+=dp[l][i];
            sum%=mod;
        }
        printf("%d\n",sum);
    }
}


發佈了178 篇原創文章 · 獲贊 21 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章