把\(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...