牛牛與陣列

2021-10-02 23:04:10 字數 1434 閱讀 2907

牛牛喜歡這樣的陣列:

1:長度為n

2:每乙個數都在1到k之間

3:對於任意連續的兩個數a,b,a<=b 與(a % b != 0) 兩個條件至少成立乙個

請問一共有多少滿足條件的陣列,對1e9+7取模

輸入兩個整數n,k

1 ≤ n ≤ 10

1 ≤ k ≤ 100000

輸出乙個整數
示例1

複製2 2

2 2
複製3

3
示例2

複製9 1

9 1
複製1

1
示例3

複製3 3

3 3
複製15

15
示例4

複製2 1234

2 1234
複製1515011

1515011
思路 :  該題是參考的其他網友的,大致思路知道了。動態規劃是真難。

dp[i][j] 表示長度為 i 的 , 以 j 結尾的 符合條件的陣列個數 , 把握住 , 長度為 i 的陣列 和 長度為 i- 1 的陣列的長度 。

dp[i][j] 是 dp[i-1][j] 加上乙個元素 x 得到的 , 他應該是 所有以 i-1 長度的陣列個數 減輕 不符合 條件的陣列 個數.

條件 3 , 任意乙個 連續的 a , b , 都有  a<=b  或者 a%b!=0  , 也就是 a 不能是 b的倍數 .看**能理解。

#include #include #include #include using namespace std ;

typedef long long ll ;

/* 牛牛與陣列

*/const int max = 1050 ;

const int inf = 0x3f3f3f3f ;

const int mod = 1e9+7 ;

int n , k ;

int dp[20][100001] ;

// dp[i][j] 表示長度為 i 且尾數為 j的陣列個數

int main()

int sum = 0 ;

int sum1 = 0 ;

for(int i = 2 ; i<=n; i++ )

for(int j = 1 ; j<=k ; j++ )

// 長度為 i且以j結尾的 陣列個數 = 長度為 i-1 的陣列個數 - 長度為 i-1 的且以 是 j 的倍數的陣列個數

dp[i][j] = (sum- sum1) %mod ; }}

int ans = 0 ;

for(int i = 1 ; i<= k ; i++ )

cout

}

牛牛與陣列DP

思路 如果正著計算容易出現遺漏,所以我們只用找 a b a是b的倍數 的方案數,然後用總數減去這個方案數就是答案。思考用dp來解決這個問題,設dp i j 表示長度為 i 的陣列第 i 位為 j 的符合要求的陣列方案數。1 i n 1 j k 邏輯 n個數的陣列,先初始化dp 1 i 1。三重迴圈,...

牛牛與陣列(DP)

牛牛喜歡這樣的陣列 1 長度為n 2 每乙個數都在1到k之間 3 對於任意連續的兩個數a,b,a b 與 a b 0 兩個條件至少成立乙個 請問一共有多少滿足條件的陣列,對1e9 7取模 輸入兩個整數n,k 1 n 10 1 k 100000輸出乙個整數輸入 2 2輸出3輸入 9 1輸出1輸入 3 ...

牛牛與陣列(DP)

牛牛喜歡這樣的陣列 1 長度為n 2 每乙個數都在1到k之間 3 對於任意連續的兩個數a,b,a b 與 a b 0 兩個條件至少成立乙個 請問一共有多少滿足條件的陣列,對1e9 7取模 輸入兩個整數n,k 1 n 10 1 k 100000輸出乙個整數 dp i j 表示前i個序列,第i個位j的時...