1. 程式人生 > >JZOJ5965【NOIP2018提高組D2T2】填數遊戲

JZOJ5965【NOIP2018提高組D2T2】填數遊戲

題目

作為NOIP2018的題目,我覺得不需要把題目貼出來了。
大意就是,在一個 n m n*m 01 01

矩陣中,從左上角到右下角的路徑中,對於任意的兩條,上面的那條小於下面的那條。問滿足這樣的矩陣的個數。
好吧,有點簡陋……


比賽思路

一眼看下去,誒, n n 這麼小,一下子就想到了狀壓DP。
然後有一點很顯然: ( i ,

j ) ( i + 1 , j
1 ) (i,j)\leq (i+1,j-1)
依照這個性質,我打出了一個狀壓DP。
然後發現,第二個樣例崩了。
然後手算了半天,推出來另一個朦朧的性質……
然後看看時間,啊,不能再推式子了!沒時間啦!
匆匆打個暴力,去思考第三題。


正解

這題的正解有很多種。
的確有狀壓DP,不過最優的方法還是lyl推了兩節數學課的神方法。
用這個方法,就算開到long long範圍,也可以秒過。

其實這題還有一個性質:
如果 ( i , j ) = ( i + 1 , j 1 ) (i,j)=(i+1,j-1) ,那麼以 ( i + 1 , j ) (i+1,j) 為左上角的矩形的所有對角線上的數字相等。
至於為什麼,也是比較好理解的。
如果有條到 ( i , j 1 ) (i,j-1) 的路徑,可以分成兩條分別走到 ( i , j ) (i,j) ( i + 1 , j 1 ) (i+1,j-1) ,再走到 ( i + 1 , j ) (i+1,j) ,在這個時候它們是相等的。如果這個矩形中有不相等的路徑,那麼必定存在一種方案使通過 ( i , j ) (i,j) 的走小的,通過 ( i + 1 , j 1 ) (i+1,j-1) 的走大的,不符合條件。所以在這個矩形中的左上角到右下角的路徑相等,要讓路徑相等,對角線就要相等。

有了這個條件,這道題就變得複雜起來。lyl大佬發揮出他超強的推式子能力,把這題A穿了。
首先,我們可以分類討論。
先討論 n = m n=m 的情況

  1. ( 0 , 1 ) = ( 1 , 0 ) (0,1)=(1,0)
    在這個情況比較簡單,答案為 2 2 4 n 2 2 n 1 2*2*4^{n-2}*2^{n-1}%
  2. ( 0 , 1 ) ( 1 , 0 ) (0,1)\neq (1,0)
    1. ( 0 , 2 ) = ( 1 , 1 ) = ( 2 , 0 ) (0,2)=(1,1)=(2,0)
      也比較簡單, 2 2 5 4 n 4 2 n 1 2*2*5*4^{n-4}*2^{n-1}

    2. ( 1 , 1 ) = ( 2 , 0 ) (1,1)=(2,0)
      在這裡插入圖片描述
      黃色表示這片區域內的對角線相等。
      f i f_i 表示到 i i 這條對角線, i 1 i-1 或之前對角線的上面兩個一樣的方案數。
      (這裡的對角線為 ( 0 , 3 ) (0,3) ( 0 , n 1 ) (0,n-1) 為右上角的兩個對角線,編號從 1 1 開始)
      那麼 f i = f i 1 4 + 4 5 f_i=f_{i-1}*4+4*5
      f i 1 4 f_{i-1}*4 表示 i 2 i-2 或之前已經有了對角線上面兩個一樣的,那麼第 i i 條對角線被限制了,所以只有 4 4 種。
      4 5 4*5 表示 i 1 i-1 有上面兩個一樣,那麼第 i i 條不受限制,有 5 5 種。

      接下來我們計算這種情況的方案數:
      2 ( 3 + 4 3 + f n 3 2 ) 2 n 2 2*(3+4*3+f_{n-3}*2)*2^{n-2}
      估計問題在 ( 3 + 4 3 + f n 3 2 ) (3+4*3+f_{n-3}*2) 這裡面。
      3 3 表示以 ( 0 , n 1 ) (0,n-1) 為右上角的對角線的上面兩個不一樣,之前的也不一樣,那麼以 ( 1 , n 1 ) (1,n-1) 為右上角的對角線不受影響,方案為 3 3
      4 3 4*3 表示以 ( 0 , n 1 ) (0,n-1) 為右上角的對角線的上面兩個一樣,之前的不一樣,那麼以 ( 1 , n 1 ) (1,n-1) 為右上角的對角線還是不受影響,方案為 4 3