fjutacm 1593 翻倍序列 線性dp

2021-09-27 13:53:18 字數 1318 閱讀 5248

problem description

滿足序列中除了第乙個數外每個數是它前乙個數的倍數的序列被稱為翻倍序列 現在要求滿足如下條件的翻倍序列: 1.序列的所有元素是1~n的正整數 2.序列的長度是k 求滿足這樣的翻倍序列的數有幾種。 由於答案能很大,輸出答案mod 1000000007(10^9+7)

input

輸入包括多組資料 每組資料是一行兩個整數n,k。(1<=n,k<=2000)

output

對於每個輸入資料,輸出乙個整數表示答案

sampleinput

3 26 4

2 1sampleoutput539

2題目其實很好理解,然後我們先用笨方法大概過一遍,符合條件的序列,第乙個位置的數可以是1~n,也就是n種可能;第二位的數只要是第一位的倍數,那也就都是可以選擇的。也就是說,特別是作為基數的第一位數字如果是1的話,一次性將帶來巨多種可能,而這種情況又是不可避免的,所以我們明確兩點:一是暴力不可取,二是一步一取模很有必要。

首先我們要明確一下大概方向。為什麼要用dp?因為我們仔細思考一下不難知道,按照題目的規則,乙個翻倍序列的可能性受其最後乙個元素(之後簡稱尾數)的大小的約束,並且兩種長度相同、尾數不同的翻倍序列所帶來的可能性之間完全沒有關係;但長度不同、較長者的尾數為較短者尾數的倍速的兩種翻倍序列所帶來的可能性,較長的可能性一定能通過較短的轉移得到,只多不少。

比如,我們設已經得到了長度為1、尾數為2的翻倍序列所帶來的可能性是dp[1][2],那麼dp[2][4]、dp[2][6]、dp[3][2]、dp[3][4]都只會是dp[1][2]加上多出的位數所帶來的新的可能性。

然後不多說虛的,結合**講具體思路。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

const

int max=

2e3+5;

using

namespace std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

int dp[max]

[max]

;/// dp[l][i],l代表長度,i代表尾數

intmain()

return0;

}

編譯安裝Nginx 1 5 9

2.執行解壓縮命令 tar zxvf nginx 1.5.9.tar.gz 3.進入解壓後的資料夾,執行 configure prefix export servers nginx 1.5.9。發現報錯 statically from the source with nginx by using w...

FJUT ACM 1868 陣列標記法

timelimit 1000ms memorylimit 128mb 64 bit integer io format lld problem description 情人節的時候,情侶們在一起開了個party,可是這個party混進了乙個單身狗,於是大家決定找出這個單身狗,已知,到場的每個人身上都...

15 9 程序間通訊 共享儲存

因為資料不需要在客戶程序和伺服器程序之間複製,所以共享儲存是最快的一種ipc。使用共享儲存時要掌握的唯一竅門是多個程序之間對一給定儲存區的同步訪問。通常,訊號量或記錄鎖被用來實現對共享儲存訪問的同步。返回值 若成功則返回指向共享儲存的指標,若出錯則返回 1 shmget獲得乙個共享儲存識別符號。si...