k好數

k進制, L位, 求此數字的左右兩邊數字相差不爲1的有多少種情況

dp[i][j]表示, 第i位,存放數字j

代碼:

#include<stdio.h>
#define N 110
#define Num 1000000007
int dp[N][N];
int main(){
    int i, j, m;
    int k, L;
    int sum;
    scanf("%d%d", &k, &L);
    
    for(i = 0; i < k; i++){//個位數是i時, 只有1種情況 
        dp[0][i] = 1;
    }
    
    for(i = 1; i < L; i++){//第i位 
        for(j = 0; j < k; j++){//存放j 
            for(m = 0; m < k; m++){//第i-1位, 存放m 
                if(j - m == 1 || m - j == 1)//和前一位相差不爲1 
                     continue;
                else
                    dp[i][j] = (dp[i - 1][m] + dp[i][j]) % Num;
            }
        }
    }
    
    sum = 0;
    for(i = 1; i < k; i++)//第L位取i時的情況相加即爲所求 
          sum = (sum + dp[L-1][i]) % Num;
    printf("%d\n", sum);
    return 0;
}


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