題目描述
小易非常喜歡擁有以下性質的數列:
1、數列的長度爲n
2、數列中的每個數都在1到k之間(包括1和k)
3、對於位置相鄰的兩個數A和B(A在B前),都滿足(A <= B)或(A mod B != 0)(滿足其一即可)
例如,當n = 4, k = 7
那麼{1,7,7,2},它的長度是4,所有數字也在1到7範圍內,並且滿足第三條性質,所以小易是喜歡這個數列的
但是小易不喜歡{4,4,4,2}這個數列。小易給出n和k,希望你能幫他求出有多少個是他會喜歡的數列。
輸入描述:
輸入包括兩個整數n和k(1 ≤ n ≤ 10, 1 ≤ k ≤ 10^5)
輸出描述:
輸出一個整數,即滿足要求的數列個數,因爲答案可能很大,輸出對1,000,000,007取模的結果。
示例1
輸入
2 2
輸出
3
package com.qiye;
import java.util.Scanner;
public class TheSequenceELike {
/**
* 說真的 我真的不會動態規劃,基本思想還是有的,一個一個放,然後除去那些不合格的
* 借鑑大佬的
*/
public static final int mod = 1000000007;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int k = scanner.nextInt();
int dp[][] = new int[n+1][k+1];
dp[0][1] = 1;
for(int i=1;i <=n; i++){
/**
* 先把所有符合條件的找出來,當前新加一個數字之後符合條件的數目依賴於原來不添加新數字時符合條件的數目
*/
int sum = 0;
for(int j = 1;j <= k;j ++){
sum += dp[i-1][j];
sum %= mod;
}
/**
* 過濾那些不符合條件的
* 即不滿足(A <= B)或(A mod B != 0)
* 這個條件怎麼理解呢? 其實就是如果前一個數是當前數的倍數且比當前數大,
* 那肯定就是不符合情況,當然不符合條件的數列的數量是之前所有不符合條件的數量
* 比如【1,2】 【1,2,1】
*/
for(int x = 1;x <= k;x ++){
int filtter = 0;
for(int y = x + x; y <= k; y += x){
filtter += dp[i-1][y];
filtter %= mod;
}
//濾掉所有不符合的情況 看作 sum - filter
dp[i][x] = (sum - filtter + mod) % mod;
}
}
int result = 0;
//最後一行就是所有符合情況的
for(int i=1;i <=k;i ++){
result += dp[n][i];
result %= mod;
}
System.out.println(result);
}
}
參考大佬代碼
https://blog.csdn.net/dingpiao190/article/details/77402437