思考難度:提高?
**難度:提高?
正解:矩陣快速冪
若令f[i]
[j]f
[i][
j]為第ii
次傳傳到第j
j個人的方案數,易知f[i
][j]
=f[i
−1][
j−1]
+f[i
−1][
j+1]
f[i]
[j]=
f[i−
1][j
−1]+
f[i−
1][j
+1]但是直接這樣遞推o(n
m)o(
nm)會t
letl
e,於是想到用矩陣來加速遞推。
可知初始矩陣中ans
[i][
i]=1
ans[
i][i
]=1,遞推矩陣中a[0
][n−
1]=a
[n−1
][0]
=1a[
0][n
−1]=
a[n−
1][0
]=1a
[i][
i+1]
=a[i
][i−
1]=1
a[i]
[i+1
]=a[
i][i
−1]=
1。進行快速冪即可,時間複雜度o(n
3×lo
g m)o(
n3×l
ogm)
,時間、空間都不允許。
但是,我們通過觀察發現,無論何時,矩陣都是迴圈的,即a=
(a1a
2a3⋯
anan
a1a2
⋯an−
1an−
1ana
1⋯an
−2⋮⋮
⋮⋮a2
a3a4
⋯a1)
a=⎝⎜
⎜⎜⎜⎜
⎛a1
an
an−1
⋮a2
a2
a1
an⋮
a3
a3a
2a1
⋮a4
⋯⋯
⋯⋯a
nan
−1a
n−2
⋮a1
⎠⎟⎟
⎟⎟⎟⎞
我們利用此性質。乘出矩陣的一行來,直接將其他的複製好,時間複雜度o(n
2×lo
g m)o(
n2×l
ogm)
,時間複雜度符合要求,但空間超了。
於是我們將矩陣縮為一維,利用迴圈的性質來求值即可,空間複雜度將為o(n
)o(n
),理論上可以通過本題,但還是tle。(18.19點2500ms+)
再來觀察矩陣,發現第一行是a1
a2 a
3 ⋯ a⌊n
+12⌋
−1a⌊n
+12⌋
a⌊n+12⌋
−1⋯ a
3 a2a
1a2
a3
⋯a⌊2
n+1
⌋−1
a⌊2n
+1⌋
a⌊2
n+1
⌋−1
⋯a3
a2(偶數自行腦補)
即對稱,所以可以優化一半常數。
但還是tle。。。(18.19點1500ms+)
我們繼續優化,發現矩陣相乘時,若有0,直接跳過,又優化了一點。(18.19點950~1100ms)
考慮觀察一行,發現計算每乙個的時候有重複計算的,我們發現可以用左面對稱和右面對稱來計算,還要考慮n為奇數偶數情況,及i為奇數偶數情況,可優化一半常數(理論上)。
於是就可以700ms通過本題了。(無o
2 o3o
2o3
)
數論出題組比賽用題 數列
思考難度 提高?難度 提高?演算法0 暴力 實際得分 0 演算法1 考慮x y 1x y 1x y 1的情況,顯然有an an 1 an 2a n a a an an 1 an 2 廢話 故 an an 1a n times a an an 1 an an an 1 a n times a n a ...
ACM 數論 博弈 (比賽用)
1.bash博弈 巴什博弈 只有一堆n個物品,兩個人輪流從中取物,規定每次最少取乙個,最多取m個,最後取光者為勝。if n m 1 0 cout 後手必勝 2.威佐夫博弈 wythoff game 有兩堆各若干的物品,兩人輪流從其中一堆取至少一件物品,至多不限,或從兩堆中同時取相同件物品,規定最後取...
學長出題 比賽題解 17 10 18
這次比賽由 falldream學長出題,歡迎去他的blog學習!t1 切課本 題意 小 z 厭惡數學,他決定將數學課本切成一塊一塊的。他的課本是乙個 n m 的矩形,小 z 決定切 k 刀,每刀他可以橫著切或者豎著切,但是切成的矩形的長和寬都必須是整數。當然,小 z 不會做出兩次相同的操作。例如 n...