1. 程式人生 > >2018網易校招內推-小易喜歡的數列

2018網易校招內推-小易喜歡的數列

題目描述:

小易非常喜歡擁有以下性質的數列:
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

解題分析:

設定一個二維狀態陣列state[[]],這個狀態陣列第一維為數列的每個數的情況,例如state=[[0, 1, 1, 1, 1], [0, 4, 3, 3, 2], [0, 12, 8, 8, 5]],表示state[0]、state[1]、state[2] 第一個數、第二個數、第三個數的狀態情況。如前面的數取1,後面可以是(1,2,3,4),如果取2,後面可以是(2,3,4),如果取3,後面可以是(2,3,4)如果取4,(3,4),這樣即為我們上述的state的第二個子序列的狀態情況,[4,3,3,2],下面的做法原理一樣。

實現程式碼如下:


def func():
    nums = [int(item) for item in raw_input().split()]
    n,k1 = nums[0],nums[1]
    state = [[0 for i in range(k1+1)] for j in range(n)]
    for j in range(n):
        for i in range(1,k1+1):
            if j == 0:
                state[j][i] = 1
            else:

                ## i為頭,看k後面可以跟多少個數
for k in range(1,k1+1): if k >= i or i%k!=0: state[j][i] += state[j-1][k] state[j][i] %= 1000000007 return sum(state[n-1])%1000000007 if __name__ == '__main__': state=func() print state