小 h 最近在研究隨機演算法。隨機演算法往往需要通過呼叫隨機數生成函式(例如 pascal 中的 random 和 c/c++中的 rand)來獲得隨機性。事實上,隨機數生成函式也並不是真正的「隨機」,其一般都是利用某個演算法計算得來的。
比如,下面這個二次多項式遞推演算法就是乙個常用演算法:
演算法選定非負整數 x0,a,b,c,d 作為隨機種子,並採用如下遞推公式進行計算。
對於任意 i ≥ 1, xi=(a*x[i-1]^2+b*x[i-1]+c)mod d 這樣可以得到乙個任意長度的非負整數數列,i≥1,一般來說,我們認為這個數列是隨機的。
利用隨機序列,i≥1,我們還可以採用如下演算法來產生乙個 1 到 k 的隨機排列,i=1 to k:
1、初始設 t 為 1 到 k 的遞增序列;
2、對 t 進行 k 次交換,第 i 次交換,交換 ti 和 t[xi mod i + 1] 的值。
此外,小 h 在這 k 次交換的基礎上,又額外進行了 q 次交換操作,對於第i 次額外交換,小 h 會選定兩個下標 ui 和 vi,並交換 t[ui] 和 t[vi] 的值。
為了檢驗這個隨機排列生成演算法的實用性,小 h 設計了如下問題:
小 h 有乙個 n 行 m 列的棋盤,她首先按照上述過程,通過 n × m + q 次交換操作,生成了乙個 1~n × m 的隨機排列 ,i=1 to n*m,然後將這 n × m 個數逐行逐列依次填入這個棋盤:也就是第 i 行第 i 列的格仔上所填入的數應為 t[(i-1)*m+uj]。
接著小 h 希望從棋盤的左上角,也就是第一行第一列的格仔出發,每次向右走或者向下走,在不走出棋盤的前提下,走到棋盤的右下角,也就是第 n 行第m 列的格仔。
小 h 把所經過格仔上的數字都記錄了下來,並從小到大排序,這樣,對於任何一條合法的移動路徑,小 h 都可以得到乙個長度為 n + m − 1 的公升序序列,我們稱之為路徑序列。
小 h 想知道,她可能得到的字典序最小的路徑序列應該是怎樣的呢?
輸入格式:
第1行包含5個整數,依次為 x_0,a,b,c,d ,描述小h採用的隨機數生成演算法所需的隨機種子。
第2行包含三個整數 n,m,q ,表示小h希望生成乙個1到 n×m 的排列來填入她 n 行 m 列的棋盤,並且小h在初始的 n×m 次交換操作後,又進行了 q 次額外的交換操作。
接下來 q 行,第 i 行包含兩個整數 u_i,v_i,表示第 i 次額外交換操作將交換 t_(u_i )和 t_(v_i ) 的值。
輸出格式:
輸出一行,包含 n+m-1 個由空格隔開的正整數,表示可以得到的字典序最小的路徑序列。
comment:這種模擬貪心題都wa了一次,還想不到貪心方法,果然是自己思維太爛。。。
1、只能開兩個5000×5000;
2、貪心方法是在加入乙個點後,將其左下部和右上部標為不可取,該過程可通過維護每行左右可取端點實現。
NOI2014 隨機數生成器
直接照著題目構造xi i 1,nm 12 9175 11624 1038 我們把矩陣陣列記為a 路徑集合 b,路徑不經過的集合c 首先 a1 3 1 必須經過 那麼a 2.3 1.2 和 a1.0 4.4 o 不能經過 然後a 2,4 2 也必須經過。a3.3 1.3 和 a1.1 5.4 o 不能...
Noi2014 隨機數生成器
傳送門 這道題卡空間。先模擬出t,大力貪心,每次選最小的走顯然最優 那麼選了 i j 它上面都只能選第 j 列以前的,它下面都只能選第 j列以後的 每次選最小,更新每行能選的區間,判斷即可 include define rg register define il inline define fill...
noi2012隨機數生成器
x n 1 ax n c mod m其中mod m表示前面的數除以m的餘數。從這個式子可以看出,這個序列的下乙個數總是由上乙個數生成的。用這種方法生成的序列具有隨機序列的性質,因此這種方法被廣泛地使用,包括常用的c 和pascal的產生隨機數的庫函式使用的也是這種方法。棟棟知道這樣產生的序列具有良好...