模擬賽1sol

2月16日簡要題解

light

這個題作爲第一題是難了一點 = =。

下文中的“有解”表示“先手必勝”,首先說一個結論:

  • 如果 N=2kN=2^k​,那麼對於任意的初始局面是有解的。
  • 否則,並不是每一種局面都是先手必勝的。

我們簡單證明一下第二個結論,假設 NN 是一個奇數,假設初始時存在相鄰兩個位置 (x,x+1)(x, x+1) 的開關狀態不一樣。那麼每次無論指定怎樣的位置集合,總存在相鄰兩個位置同時被操作或者不被操作,我們讓這兩個位置作用到 (x,x+1)(x, x+1) 上,那麼它們的開關狀態仍然保持不同。如果 N=2ksN=2^k\cdot s ,其中 ss 是一個大於 1 的奇數時的證明類似。

因爲我們保證輸入有解,總可以把他歸約到 2k2^k 的情形,下面討論 N=2kN=2^k 時候的情形。

我們遞歸地構造 01 矩陣:

  • N=1N=1 時候:
1
  • N=2N=2 時候:
1 0
1 1
  • N=4N=4 時候:
1 0 0 0
1 1 0 0
1 0 1 0
1 1 1 1
  • N=8N=8 時候:
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

以此類推,讀者很容易發現他的規律:對構造好的 N=2kN=2^k 的矩陣,把它複製 3 份放在左上、左下和右下,右上角以 0 填充。

這個矩陣很有特點,它有兩個很關鍵的性質:

  • 把每一行視爲一個 01 向量,那麼它是一個線性基。
  • xix_i 表示第 i 行的向量,令 xix'_i 表示將 xix_i 循環移位若干位的向量,那麼 xixix_i \oplus x'_i 一定可以用 [i+1,N][i+1, N] 行的向量拼出來。
    • 舉個例子,考慮:11110000 和它的循環移位 01111000,它們異或之後的結果爲 10001000,恰好是矩陣下一行。

讀者不難證明自行以上兩個性質。通過這兩個性質我們可以馬上得到一個答案的下界:對於給定的 01 串,我們可以用線性基的知識找到它是哪幾行拼出來的。假設最高的一行爲第 ii 行,那麼答案爲 Ni+1N-i+1 :先手輸入第 ii 行的向量,無論後手如何應對,這一輪結束之後第 ii 行從 01 串的線性表示中消失,並且只會引入更低行的新向量。重複這個過程即可。

容易證明 Ni+1N-i+1 也是答案的上界,從而就是答案,這一部分工作留給讀者完成。

所以最後的算法即爲模擬一下就好了,代碼量符合第一題的標準。

count

看起來大家都會啊。。。你們互相交流一下吧 QwQ

calc

首先組合意義轉化一下,對於給定的 kk, fk(n)f_k(n) 表示這樣一個值:

  • 想象你有無限多個面值爲 1,k,k2,,kx,1, k, k^2, \dots, k^x, \dots 的硬幣,那麼 fk(n)f_k(n) 爲本質不同的,用這些硬幣湊出 knkn 的方案數。

解釋:考慮遞歸式:
fk(n)=i=0nfk(ik) f_k(n) = \sum_{i=0}^{n} f_k\left(\left\lfloor \frac{i}{k} \right\rfloor\right)
要湊出 knkn,我們枚舉面值 1 用了 k(ni)k(n-i) 個,那麼剩下要湊的是 kiki 且最小可用的面值是 kk,這樣相當於用 1,k,k2,1, k, k^2,\dots 去湊 ii ,這個方案數恰好爲 fk([i/k])f_k([i/k])

問題的後一部分參見 BZOJ 4588,因爲允許在本地跑,複雜度可以高一點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章