2月16日簡要題解
light
這個題作爲第一題是難了一點 = =。
下文中的“有解”表示“先手必勝”,首先說一個結論:
- 如果 ,那麼對於任意的初始局面是有解的。
- 否則,並不是每一種局面都是先手必勝的。
我們簡單證明一下第二個結論,假設 是一個奇數,假設初始時存在相鄰兩個位置 的開關狀態不一樣。那麼每次無論指定怎樣的位置集合,總存在相鄰兩個位置同時被操作或者不被操作,我們讓這兩個位置作用到 上,那麼它們的開關狀態仍然保持不同。如果 ,其中 是一個大於 1 的奇數時的證明類似。
因爲我們保證輸入有解,總可以把他歸約到 的情形,下面討論 時候的情形。
我們遞歸地構造 01 矩陣:
- 時候:
1
- 時候:
1 0
1 1
- 時候:
1 0 0 0
1 1 0 0
1 0 1 0
1 1 1 1
- 時候:
1 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 1 0 0 0 0 0
1 1 1 1 0 0 0 0
1 0 0 0 1 0 0 0
1 1 0 0 1 1 0 0
1 0 1 0 1 0 1 0
1 1 1 1 1 1 1 1
以此類推,讀者很容易發現他的規律:對構造好的 的矩陣,把它複製 3 份放在左上、左下和右下,右上角以 0 填充。
這個矩陣很有特點,它有兩個很關鍵的性質:
- 把每一行視爲一個 01 向量,那麼它是一個線性基。
- 令 表示第 i 行的向量,令 表示將 循環移位若干位的向量,那麼 一定可以用 行的向量拼出來。
- 舉個例子,考慮:
11110000
和它的循環移位01111000
,它們異或之後的結果爲10001000
,恰好是矩陣下一行。
- 舉個例子,考慮:
讀者不難證明自行以上兩個性質。通過這兩個性質我們可以馬上得到一個答案的下界:對於給定的 01 串,我們可以用線性基的知識找到它是哪幾行拼出來的。假設最高的一行爲第 行,那麼答案爲 :先手輸入第 行的向量,無論後手如何應對,這一輪結束之後第 行從 01 串的線性表示中消失,並且只會引入更低行的新向量。重複這個過程即可。
容易證明 也是答案的上界,從而就是答案,這一部分工作留給讀者完成。
所以最後的算法即爲模擬一下就好了,代碼量符合第一題的標準。
count
看起來大家都會啊。。。你們互相交流一下吧 QwQ
calc
首先組合意義轉化一下,對於給定的 , 表示這樣一個值:
- 想象你有無限多個面值爲 的硬幣,那麼 爲本質不同的,用這些硬幣湊出 的方案數。
解釋:考慮遞歸式:
要湊出 ,我們枚舉面值 1 用了 個,那麼剩下要湊的是 且最小可用的面值是 ,這樣相當於用 去湊 ,這個方案數恰好爲 。
問題的後一部分參見 BZOJ 4588,因爲允許在本地跑,複雜度可以高一點。