波動數列 DP 組合

2021-10-02 12:08:54 字數 1436 閱讀 6883

觀察這個數列:

1 3 0 2 -1 1 -2 …

這個數列中後一項總是比前一項增加2或者減少3,且每一項都為整數。

棟棟對這種數列很好奇,他想知道長度為 n 和為 s 而且後一項總是比前一項增加 a 或者減少 b 的整數數列可能有多少種呢?

輸入格式

共一行,包含四個整數 n,s,a,b,含義如前面所述。

輸出格式

共一行,包含乙個整數,表示滿足條件的方案數。

由於這個數很大,請輸出方案數除以 100000007 的餘數。

資料範圍

1≤n≤1000,

−109≤s≤109,

1≤a,b≤106

輸入樣例:

4 10 2 3

輸出樣例:

2樣例解釋

兩個滿足條件的數列分別是2 4 1 3和7 4 1 -2。

做法:f[i][j]表示前i個的第j項的餘數的值。 因為可以推出 下一項等於前一項c ± p ,p可能是a或者-b 所以可以推出 j = c - ai 或者 j = c + bi。 所以可得遞推式:

f [i

][j]

=(f[

i−1]

[get

mod(

j+a∗

i,n)

]+f[

i−1]

[get

mod(

j−b∗

i,n)

])

f[i][j] = (f[i - 1][get_mod(j + a * i, n)] + f[i - 1][get_mod(j - b * i,n)]) % mod

f[i][j

]=(f

[i−1

][ge

tm​o

d(j+

a∗i,

n)]+

f[i−

1][g

etm​

od(j

−b∗i

,n)]

)

#include 

using namespace std;

const

int mod =

1e8+7;

int n,s,a,b;

int f[

1005][

1006];

intget_mod

(int x,

int y)

intmain()

} cout << f[n -1]

[get_mod

(s,n)];

return0;

}

E波動數列(dp)

由於這道題目的資料量比較大,採用dp處理的時候,還涉及到滾輪陣列。關於滾輪陣列的講解 題意分析 include include define maxn 1100 define mod 100000007 using namespace std typedef long long ll ll n,s,...

波動數列 數論推導,dp

題目鏈結 觀察這個數列 1 3 0 2 1 1 2 這個數列中後一項總是比前一項增加2或者減少3,且每一項都為整數。棟棟對這種數列很好奇,他想知道長度為 n 和為 s 而且後一項總是比前一項增加 a 或者減少 b 的整數數列可能有多少種呢?共一行,包含四個整數 n,s,a,b,含義如前面所述。共一行...

AcWing 1214 波動數列(推柿子 DP)

觀察這個數列 1 3 0 2 1 1 2 這個數列中後一項總是比前一項增加2或者減少3,且每一項都為整數。棟棟對這種數列很好奇,他想知道長度為 n 和為 s 而且後一項總是比前一項增加 a 或者減少 b 的整數數列可能有多少種呢?輸入格式 共一行,包含四個整數 n,s,a,b,含義如前面所述。輸出格...