P5004 專心OI 跳房子 解題報告

2022-04-30 18:18:11 字數 964 閱讀 8236

把\(n\)個無色格仔排成一行,選若干個格仔染成黑色,要求每個黑色格仔之間至少間隔\(m\)個格仔,求方案數

根據題面,這一題似乎可以用遞推

設第\(i\)個格仔的編號為\(i\),有\(i\)個格仔時的方案數為\(f(i)\)

顯然,當 \(i \le m+1\) 時,

可以所有格仔不染色(方案數為\(1\)種,或者最多乙個格仔染色(方案數為\(i\)種)

所以有\(f(i)=i+1\)

當\(i>m+1\)時,

對於第\(i\)個格仔可以由第\(i-1\)個格仔轉移過來,

而第\(i\)個格仔有兩種情況

1、不染色,顯然可以這種情況下方案數為\(f(i-1)\)

2、染色,可以看出第\([i-m,i-1]\)個格仔必定不染色,也就是沒有貢獻的,方案數為\(f(i-m-1)\)

但是!

\(n \le 10^\),\(m \le 15\)

可以使用矩陣加速遞推

我們要記錄的是應該是\(f(i) \to f(i+m)\)一共\(m+1\)個元素,於是就用乙個\((m+1)^2\)的矩陣進行加速,配合快速冪求解

code:

#include#define ll long long

#define mod 1000000007

#define n 20

using namespace std;

int n;

ll b;

struct noderes,a;

node operator* (const node a,const node b)//過載*運算

}int main()

P5004 專心OI 跳房子

傳送門 solution 考慮線性dp。f i 表示前 i 個格仔 僅限於跳到前 i 個格仔 有多少種跳法。則 f i f 1 f 2 f i m 1 不會打xigema,湊合著看吧 然而 n 很大,無法用 operatorname n 的時間來做。發現 m 很小,立刻想到矩陣乘法優化線性dp。維護...

P5004 專心OI 跳房子 dp,矩陣乘法

把n nn個無色格仔排成一行,可以把某些格仔染成黑色,但兩個黑色格仔之間必須至少有m mm個無色格仔,求方案數 首先很明顯 f n i 0 n m 1f if n sum f i fn i 0 n m 1 fi 然後我們發現 i 0n m 1fi sum f i i 0n m 1 fi 就是字首和,...

洛谷P5002 專心OI 找祖先

題目描述 這個遊戲會給出你一棵樹,這棵樹有nn個節點,根結點是rr,系統會選中mm個點p 1,p 2 p m 要imakf回答有多少組點對 u i,v i 的最近公共祖先是p i imakf是個小蒟蒻,他就算學了lca也做不出,於是只好求助您了。imakf畢竟學過一點oi,所以他允許您把答案模 10...