1. 程式人生 > >NOIP2018模擬9.8

NOIP2018模擬9.8

集中 最大匹配 思路 沒有 數字 失誤 語句 當前 不定方程

第二場模擬。

20+50+50

第一題失誤:

1、不定方程沒有判無解情況。

2、10^14級別的兩個數相乘沒有註意到會爆long long。

第二題打的是暴力,考完之後冷靜下來發現正解,思路不夠開闊吧。

第三題思路錯誤,打了一個錯誤的方法,奈何數據垃圾,居然沒有爆零。

T1

題目大意:

給出a,b,c三個正整數,求ax+by=c的非負數解的個數。

題解:

用拓展歐幾裏得求不定方程的最小解就可以了。

T2

題目大意:

給出變量a,c,k,m,n

執行以下語句:

z=[(z*a+c)/k]%mo

if (z<m/2) return 0;else return 1;

執行n次得到一個01串。

現在給出目標01串,求[0,m]內可行的z的個數。

題解:

暴力是O(n*m)的,我們考慮優化。

我們發現復雜度主要集中在模擬執行語句上。

發現如果知道當前的z是什麽,接下來生成的01串是固定的,這顯然是可以預處理的。

預處理的方法的倍增。

設數組f[i][j],表示數i在執行了2^j次語句後得到的數字。

快速比對是否吻合目標串,用哈希。

維護數組g[i][j],表示數i執行了2^j次語句之後輸出的01串的哈希值。

用倍增數組維護暴力跳的過程即可。

T3

題目大意:

給出一個DAG,一個點可以選擇當且僅當它所有可以到達的點均沒有被選,求最多選擇的點數。

題解:

求最大獨立集。

最大獨立集=最小鏈覆蓋。

最小鏈覆蓋=點數-最大匹配。

首先我們Floyd處理每個點的可達點。

DAG轉二分圖,假設有一條x-->y的邊,x拆成x1和x2,y拆成y1和y2,x1向y2連邊就行了。

至於為什麽答案就是點數減去最大匹配,簡單說明以下。

考慮匹配的意義,每次匹配成功說明某兩條邊變成一條了,所以這是對的哦!

NOIP2018模擬9.8