1. 程式人生 > >NOI模擬賽 #2

NOI模擬賽 #2

T1 尤拉子圖

給一個無向圖,如果一個邊集的匯出子圖是一個歐拉回路,則 ans 加上這個邊集邊數的平方,求 ans ,膜 998244353

$n,m \leq 152501$

sol:

考慮如果邊數不是平方,而是一次方,那對於每個邊,它對 ans 的貢獻就是強行選它的方案數

如果是平方,貢獻就是列舉兩個邊 $x,y$ ( $x,y$ 可以相同),計算強制選它們的方案數

 

Task #1 $n \leq 60,m \leq 100$

需要一個多項式演算法計算強制包含兩條邊的尤拉子圖方案數

我們把每個點看成一個關於度數的方程,設 $x_i$ 表示第 i 條邊選不選,對第 j 個方程 $a_{(j,i)}$ 為 [第 i 條邊的端點為 j]

因為每個點度數都要為偶數,於是方程的右邊都要在膜 2 意義下為 0

欽定兩條邊選不選很簡單,加 $x_a = 1$ 和 $x_b = 1$ 兩個方程即可,這個方程組有多少解,強行選這兩個邊的方案數就有多少

高斯消元,方案數就是 $2^c$ (c 為自由元個數)

因為在膜 2 意義下進行,可以 bitset 優化一下,複雜度 $O(\frac{n^2 \times m^3}{64})$,這個資料範圍很好過

bitset 實戰很快,可以在 1s 內消 2000 的 xor 方程組


Task #2 $n,m \leq 300$

隨便搞一個 dfs 樹,“強制選兩個邊”就是刪掉兩條邊,欽定一些點度數為奇數,剩下為偶數,可以強行 dp 一下,由於跟正解沒啥關係,略去


Task #正解 $n,m \leq 152501$

延續 Task #1 的思路,注意到不同連通分量是獨立的

對於一個連通圖有多少個尤拉子圖呢?觀察方程組可以發現是 $2^{m-n+1}$ 個

不連通呢?設 $s$ 為聯通塊個數,發現是 $2^{m-n+s}$ 個

現在我們要欽定選兩條邊,發現如果欽定到了一條橋邊,肯定是不行的,因為橋兩邊度全變成了奇數,而之後只能不斷加若干偶數

然後發現,刪掉兩條不是橋的邊,其實是可以改變圖連通性的,如果連通性不變,連通塊是 $2^{m-n+s-2}$ 個,如果改變,連通塊是 $2^{m-n+s-1}$ 個

於是問題變成了“有多少種 [刪掉兩條都不是橋邊的邊] 的方式,使得圖不連通”

 

前置問題:DZY Loves Chinese II (直接放連結了)

給一個無向圖,每次詢問如果刪掉一個邊集,圖是否依然連通,每次刪掉的邊集大小不超過 15

 

還是非樹邊 ran 一下,樹邊 xor 一下,如果兩個邊權值一樣,刪掉它們就會改變連通性,用 map 記一下每種權值就可以了

複雜度 $O(mlogm)$

 

 

 

 

 

T2 求和

求一個積性函式字首和,這個函式滿足 $f_{p^d} = p^{d-[d \space mod \space p ≠ 0]}$

Task #1 $n \leq 10^7$

線性篩基本操作


Task #2 & #3 $n \leq 10^{12}$

杜教篩基本操作,寫的不好只能過 $n \leq 10^9$ 的點

但出題人說 Task #2 是給分塊打表的...

打表之後就是一個區間篩,我們把不超過 $\sqrt{n}$的素數加進去篩一下就行了


Task #正解 $n \leq 10^{14}$

構造 $ G = F * μ $ (狄利克雷卷積),顯然當 $d = 1$ 時 $G(p) = 0$

 

[狄利克雷卷積] $μ * 1 = [n=1]$,$\phi * 1 = n$

$G_n = \sum_{d|n}f_d \times μ_{\frac{n}{d}}$

 

發現 $G_{p^c} = f_{p^c} - f_{p^{(c-1)}}$

$G_p = f_p \times μ_1 + f_1 \times μ_p = 0$

然後 $G_n = G_{p_1^{c_1}} \times G_{p_2^{c_2}} \times ... \times G_{p_n^{c_n}}$

於是 $n = a^2 \times b^3$

莫比烏斯反演 :$G = f * μ$ 則 $f = G * 1$

$f_n = \sum_{d|n}G_d$

$f_i = \sum_{i=1}^n \sum_{d|i}G_d = \sum_{d=1}^{n}G_d \times \lfloor \frac{n}{d} \rfloor$

滿足 $n = a^2 \times b^3$ 的 $n$ 的數量是 $O(\sqrt{n})$ 的,搜出來即可

 

 

 

 

 

T3 數學難題


Task #1 & #2 $n \leq 1000$

$F_{(i,j)} = \frac{(i+1)!}{j!(i-j)!}$

發現矩陣是楊輝三角的第 i 行乘以 i 的值,暴力即可

Task #正解 $n \leq 152501$

構造一下可以發現答案是 $lcm(n-k+1,n-k+2,...,n)$

線段樹即可