傳送門 to luogu
將道路看成乙個很高很瘦的傢伙(乙個 n×2
n\times 2
n×2 的瘦高個)。
考慮最後一行(或者說,第一行)是什麼情況。用 f(n
)f(n)
f(n)
表示答案。
不好搞定的是第三種情況。下面都只討論第三種情況。如圖。
不妨設第一行的 1×1
1\times 1
1×1 磚塊在右側。最開始,放置方法唯一,如圖(1)
(1)(1
)。下一步,由於某一行有乙個「空洞」,我得將其填補,所以如圖(2)
(2)(2
)。反覆填補,直到遇到另乙個 1×1
1\times 1
1×1 的磚塊才能夠停止。可能是任意一行。如圖(3)
(3)(3
)。這說明,我們只需要唯一確定另一塊 1×1
1\times 1
1×1 的磚塊在哪一行即可。在這兩塊 1×1
1\times 1
1×1 的磚塊之間的方案是唯一的。而剩餘部分(頂上的空白)是簡單情況。
如果用 g(n
)g(n)
g(n)
表示只使用 1×2
1\times 2
1×2 的磚塊填滿 n×2
n\times 2
n×2 的道路的方案數,那麼有遞推式
f (n
)=f(
n−1)
+f(n
−2)+
2∑i=
0n−3
g(i)
f(n)=f(n-1)+f(n-2)+2\sum_^g(i)
f(n)=f
(n−1
)+f(
n−2)
+2i=
0∑n−
3g(
i)i
ii 的上界是 n−3
n-3n−
3,因為兩個 1×1
1\times 1
1×1 磚塊至少有3
33行(不信看圖(1)
(1)(1
),清晰明了)。還要乘2
22,是因為第一行的 1×1
1\times 1
1×1 磚塊可以在左,也可以在右。
然後問題是g(n
)g(n)
g(n)
怎麼求?然而是一樣的分析方法——g(n
)=g(
n−1)
+g(n
−2)g(n)=g(n-1)+g(n-2)
g(n)=g
(n−1
)+g(
n−2)
我們只需要用乙個矩乘快速冪優化一下即可。複雜度o(q
logn)
\mathcal o(q\log n)
o(qlogn)
(我的常數為4
34^3
43)。
#include
#include
#include
using
namespace std;
inline
intreadint()
const
int mod =
1e9+7;
struct matrix
static matrix i()
matrix operator*(
const matrix &b)
const
void
output()
const};
inline matrix qkpow
(matrix x,
int q)
matrix q, s;
int t;
void
input()
void
solve()
}int
main()
詳 析 GXOI GZOI2019 逼死強迫症
在 2 times n 的方格中用 n 1 塊 2 times 1 的方磚和 2 塊 1 times 1 的方磚填充,且兩塊 1 times 1 的方塊不能有相鄰的邊,求合法方案數。啊,一道計數問題。反正我開始是這樣想的。如果沒有那兩塊很礙事的磚,這不就是斐波拉契遞推嗎?f i f i 1 f i ...
GXOI GZOI2019 舊詞 解題報告
對於一棵 n 個節點的樹,給出 m 次詢問和常數 k 每次給出 r,x 求 sum limits r depth lca i,x k n,m le 5 times 10 4 1 le r,x le n k le 10 9 如果有做過 lnoi2014 lca,就很容易想出解法。可以通過樹上差分,點 ...
題解 GXOI GZOI2019 旅行者
調這個題調了兩個月,被自己蠢哭 給乙個有向圖,一組關鍵點,求關鍵點之間的最短的距離 這個題目有兩種做法,分別是 nlogn 和 nlog 2n 的 首先說 nlogn 的官方做法,我們考慮多源迪傑斯特拉 正圖上從 k 個關鍵點出發跑 dijkstra 記某個點離最近的關鍵點距離為 dis 0 i 反...