Atcoder 計數亂做


ARC132E Paw (3100)

記覆蓋為左為 <-,覆蓋為右為 ->,不覆蓋為 =。則最后一定變成 <<<...===...>>>,且等號兩側是兩個相鄰的洞。

考慮對每兩個相鄰的洞算最后形成這種情況的概率。設左邊有 \(L\) 個洞,右邊有 \(R\) 個洞。

顯然左右是獨立的,只考慮右邊。那么只要求每次選擇時,如果選到最左的,不能向左走。即有:

\[F_n=(1-\dfrac{1}{2n})F_{n-1}=\sum\limits_{i=1}^n \dfrac{2i-1}{2i} \]

概率即為 \(F_lF_r\)

時間復雜度 \(O(n)\)

ARC132F Takahashi The Strongest (3000)

發現 T 能贏 A 和 S 當且僅當 A 和 S 出一樣的,而 T 比他們倆都大。

考慮把給出的策略扔進四元冪級數里,然后做以下運算的卷積:

\[x \otimes y= \begin{cases} x,x=y\\ 3,x \neq y \end{cases} \]

由 FWT 理論,構造變換矩陣:

\[\left[ \begin{matrix} 1 & 0 & 0 & 1\\ 0 & 1 & 0 & 1\\ 0 & 0 & 1 & 1\\ 0 & 0 & 0 & 1\\ \end{matrix} \right] \]

太好看了,所以隨便求出逆矩陣:

\[\left[ \begin{matrix} 1 & 0 & 0 & -1\\ 0 & 1 & 0 & -1\\ 0 & 0 & 1 & -1\\ 0 & 0 & 0 & 1\\ \end{matrix} \right] \]

求出卷積 \(F\) 后翻轉一下,現在只需要對每一個集合求 \(F\) 中與它至少有一位相同的集合數量。

容斥一下,變成每一位都不同,可以再 FWT。

總時間復雜度 \(O(k4^k)\)

ABC225H Social Distance 2 (3000)

先考慮 \(K=0\),並且要對三種情況分別算 \(S1(n,m)\)\(S2(n,m)\)\(S3(n,m)\),分別是:

  • 兩旁都坐人
  • 左邊坐人,右邊無人
  • 兩旁都無人

用一些簡單的生成函數可以推導出分別是 \(\dbinom{n+k-1}{2k+1}\)\(\dbinom{n+k-1}{2k}\)\(\dbinom{n+k-1}{2k-1}\)

最后分治 FFT 卷到一起即可。

時間復雜度 \(O(n \log^2 n)\)

ARC101F Robots and Exits (2900)

經過 114514 分鍾思考后,記 \(L_i\)\(R_i\) 分別為第 \(i\) 個機器人到最近左右出口的距離。

注意到方案僅在於每個機器人是從左還是右出口離開。並且如果機器人不消失的話,向左和向右是相對獨立的。也就是過程一定是向左走一段,再向右走一段……

\(L_i\) 排序,再設單調不降的數組 \(P_i\),那么過程可以看作向左走 \(L_1\),再向右走 \(P_1\),再向左走 \(L_2\),再向右走 \(P_2\)……

最后若 \(P_i \geq R_i\),那么機器人 \(i\) 就從左出口離開;否則從右出口離開。

現在問題被簡化了許多,考慮對 \(R_i\) DP。設 \(dp_i\) 表示 \(P_i=R_i\)\(P_{i-1}<R_i\) 的方案數。

\[dp_i=\sum\limits_{0 \leq j<i \wedge R_j<R_i} dp_j \]

注意 \(dp_0=1\)

然而這樣不太正確,原因在於某些機器人的 \(L\) 相同,它們的 \(P\) 也必須相同,這樣后面就會算重(因為只需加一次)。

解決辦法很簡單,如果 \(L_i=L_{i-1}\) 的話,就做個差分即可。

二維偏序用樹狀數組優化,時間復雜度 \(O(n \log n)\)

AGC032F One Third (4000)

考慮轉化問題。認為操作是在圓周上畫紅點,並且每畫一個紅點就在順時針 \(120^\circ\) 位置畫一個綠點,在逆時針 \(120^\circ\) 位置畫一個藍點。

於是問題變為了兩個異色點間最短距離期望。

按第一次畫點斷環為鏈,問題變為:

一根長度為 \([0,\dfrac{1}{3}]\) 的線段的左端點為紅點,右端點為藍點。隨機位置隨機顏色畫 \(n-1\) 個點,求兩個異色點最短距離期望。

顯然最短的異色點對一定是相鄰的,考慮枚舉相鄰異色點對數 \(k\),再計算概率和條件期望相加即可。

  • 概率:只考慮同色連續段,這樣相鄰兩個點一定異色。設以 R 開頭,B 結尾的方案數為 \(f_n\),以 R 結尾的方案數為 \(g_n\),則 \(f_n=f_{n-1}+g_{n-1},g_n=2f_{n-1}\)。最后再插板乘上 \(\dbinom{n}{k}\) 即可。

  • 條件期望:異色點對連成的線段總長度期望為 \(\dfrac{k}{3n}\),由隨機變量相關理論可知最短期望為 \(\dfrac{1}{k^2} \times \dfrac{k}{3n}=\dfrac{1}{3nk}\)

時間復雜度 \(O(n)\)

ABC236Ex Distinct Multiples (2900)

顯然唯一難搞的就是 “互不相同” 條件,直接考慮容斥。

也許會考慮欽定一些點填的數必須相同,但這樣需要記錄若干組點集,難以實現。

不妨考慮欽定邊集(兩個點填的數相同即連邊)。設 \(f_S\) 表示恰好連 \(S\) 邊的方案數,\(g_S\) 表示欽定連 \(S\) 邊的方案數。

顯然 \(g_S=\sum\limits_{T \supseteq S} f_T\),由子集反演得 \(f_{\varnothing}=\sum\limits_{S} (-1)^{|S|} g_S\)

由於邊集太大,我們無法直接枚舉 \(S\) 計算。但 \(g_S\) 只與連接 \(S\) 后分成的若干聯通塊的點集有關,可以考慮枚舉點集。\(g_S\) 即為若干聯通塊的方案數相乘,可以對每個聯通塊分別考慮,最后直接子集卷積 \(\exp\) 即可。

現在枚舉 \(n\) 個點的點集 \(V\),考慮其中所有使 \(V\) 聯通的邊集 \(S\) 的權值(即 \((-1)^{|S|}\))之和,設其為 \(P_n\)

\(Q_{n,k}\) 表示 \(n\) 個點的點集,\(k+1 \sim n\) 的每個點都要與 \(1 \sim k\) 中某個點聯通的權值之和。

  • \(k>1\) 時,考慮 \(1\) 號點與 \(2\) 號點,它們間連邊與不連邊的權值正好相反,於是 \(Q_{n,k}=0\)

  • \(k=1\) 時,考慮 \(n\) 號點連出的邊有 \(t\) 條,方案數為:

\[Q_{n,1}=(-1)\sum\limits_{t=1}^{n-1} \dbinom{n-1}{t} Q_{n-1,t}=-(n-1)Q_{n-1,1} \]

\(P_n=(-1)^{n-1} (n-1)!\)

總時間復雜度 \(O(n^2 2^n)\)

AGC044 Random Pawn (3600)

\(f_i\) 表示出生在 \(i\) 號點,最優策略下的期望分數,顯然有轉移式:

\[f_i=\max\{A_i,\dfrac{1}{2}(f_{i-1}+f_{i+1})-B_i\} \]

然而我們並不知道轉移順序。仔細觀察,不妨設 \(A_1\)\(A_i\) 中的最大值,由於所有 \(f_i \leq A_1\),可得\(f_1=A_1\)。可以以此斷環為鏈(新開與 \(1\) 號點相同的 \(n+1\) 號點)。

然而剩下的仍不知道轉移順序。但是觀察發現如果 \(B_i=0\),事實上只需要求出所有 \((i,A_i)\) 構成的上凸殼,即可算出答案。

嘗試做一些轉換使原問題變為 \(B_i=0\)。令 \(g_i=f_i-C_i\),則:

\[g_i+C_i=\max\{A_i,\dfrac{1}{2}(f_{i-1}+f_{i+1}+g_{i-1}+g_i)-B_i\} \]

\[g_i=\max\{A_i-C_i,\dfrac{1}{2}(f_{i-1}+f_{i+1})+\dfrac{1}{2}(g_{i-1}+g_i)-B_i-C_i\} \]

我們希望對於所有 \(i \in [2,n]\)\(\dfrac{1}{2}(g_{i-1}+g_i)-B_i-C_i=0\),即 \(C_{i+1}=2B_i+2C_i-C_{i-1}\)

待定系數,設 \(C_1=0\)\(C_2=k\),依次遞推出 \(C_{n-1}=pk+q\)\(C_{n}=p'k+q'\) 即可算出 \(k=\dfrac{2B_n-q+2q'}{p-2p'}\)

時間復雜度 \(O(n)\)

ARC134F Flipping Coins (3500)

顯然 \(i\) 只會影響 \(p_i\),因此把排列拆成若干循環,循環間互相獨立。接下來考慮計算循環方案數的生成函數,最后 \(\exp\) 即可得到答案。

對於每個循環,再分成若干條極長單調遞增的鏈(有序),稱每條鏈的鏈尾為“壞的”(即滿足 \(p_i<i\) 的點),則最后向上的硬幣數量就是壞點被操作的次數。

設每條鏈的生成函數為 \(F(x)=\sum\limits_i W^{i \bmod 2}x^i\),然而大力卷會算重。

我們發現不滿足限制(即不是極長的)的兩條鏈可以組成一條更長的鏈,嘗試容斥,然而鏈的長度帶權,無法直接容斥。

考慮一種神奇的做法:我們不直接容斥,而是給每個長度賦一個新的權,其生成函數為 \(A(x)\),再使 \(A\) 以任意方式組合起來后恰好為正確的方案數:

\[\dfrac{1}{1-A(x)}=F(x) \]

\[A(x)=1-\dfrac{1}{F(x)} \]

而答案的生成函數為:

\[\hat S(x)=\exp[\sum\limits_{i} \dfrac{\hat A(x)^i}{i!} (i-1)!]=\dfrac{1}{1-\hat A(x)} \]

\(G(x)=\dfrac{1}{F(x)}\),則 \(\hat S(x)=\dfrac{1}{\hat G(x)}\)

只需要多項式求逆甚至不需要卷積,時間復雜度 \(O(n\log n)\)

一句話題解:多項式求逆

ARC133E Cyclic Medians (3300)

眾所周知 \(E(X)=\sum\limits_{i \geq 0} P(i>X)\)。設最后結果為 \(a\),考慮枚舉 \(k\),算 \(a>k\) 的方案數。

\(>k\) 的數為 \(1\)\(\leq k\) 的數為 \(0\)。則若 \(x_i=y_j\),則 \(a\) 會改變;否則不變。

考慮 \(a\) 在過程中是否改變(遇到 \(x_i=y_j\) 即認為改變)。

  • 對於改變的情況,\(a\)\(A\) 無關,故 \(k=p,a=id\)\(k=V-p,a=1-id\) 的方案數是一樣的(即對稱),直接除 \(2\) 即可。用總方案數減去不變情況數即為改變情況數。

  • 對於不變的情況,\(x\)\(y\) 十分有限。設 \(g=\gcd(x,y)\),則 \(a\) 會經過每一對 \((x,y)\) 滿足 \(x \equiv y \pmod g\)。故 \(x_i=x_{i+tg}\)\(y_i=y_{i+tg}\)\(x_i \neq y_i\)(否則一定會有 \(x_{i+tg}=y_i\))。方案數即為 \([k^{n/g}(V-k)^{m/g}+k^{m/g}(V-k)^{n/g}]^g\)

總時間復雜度 \(O((n+m)\log V)\)

ARC133F Random Transition (???)

Sol1

設題目給出的概率為 \(w_a\)

大力 DP,用矩陣快速冪優化,可以得到 \(O(n^3 \log k)\) 的優秀做法。(特征多項式貌似求得出來,但是轉移矩陣不會快速算 \(t\) 次冪,做不動)

問題模型看起來很自然,考慮轉化一下。假設求由 \(a\)\(b\) 的概率,問題等價於:

\(n\) 枚硬幣,其中 \(a\) 枚硬幣朝上。\(k\) 次操作,每次隨機翻動一枚硬幣,求最后有 \(b\) 枚硬幣朝上的概率。

這樣硬幣間獨立開了。考慮對每枚硬幣寫出二元生成函數,\(x\) 表示翻動次數,\(y\) 表示貢獻。

\[F(x,y)=\sum\limits_{2 \mid i} \dfrac{x^i}{i!} y+\sum\limits_{2 \nmid i} \dfrac{x^i}{i!}=\dfrac{1}{2}[e^x(y+1)+e^{-x}(y-1)] \]

\[G(x,y)=\sum\limits_{2 \mid i} \dfrac{x^i}{i!}+\sum\limits_{2 \nmid i} \dfrac{x^i}{i!} y=\dfrac{1}{2}[e^x(y+1)-e^{-x}(y-1)] \]

\(P=e^x(y+1)\)\(Q=e^{-x}(y-1)\),則要求的概率即為:

\[\dfrac{1}{k!} \dfrac{1}{n^k} [x^ky^b]F^aG^{n-a}=\dfrac{1}{k!} \dfrac{1}{n^k} \dfrac{1}{2^n} [x^ky^b] (P+Q)^a (P-Q)^{n-a} \]

把括號展開,並對所有 \(a\) 求和,設 \(\sum\limits_a w_a (P+Q)^a(P-Q)^{n-a}=\sum\limits_{t=0}^n c_t P^t Q^{n-t}\),至於 \(c_t\) 怎么求一會再說。

考慮 \([x^k]P^tQ^{n-t}=\dfrac{(2t-n)^k}{k!} (y+1)^t (y-1)^{n-t}\),故答案即為:

\[ANS(y)=\dfrac{1}{n^k} \dfrac{1}{2^n} \sum\limits_t (2t-n)^k c_t (y+1)^t (y-1)^{n-t} \]

驚訝地發現答案的形式與 \(c_t\) 的式子是一樣的!直接分治乘即可(注意 \(t=0\) 要分開算)。

總時間復雜度 \(O(n \log^2 n)\)

Sol1+

注意到時間復雜度瓶頸在於計算:

\[\sum\limits_{i=0}^n w_i (x+1)^i (x-1)^{n-i} \]

\[\begin{aligned} F(x)&=\sum\limits_{i=0}^n w_i (x+1)^i (x-1)^{n-i}\\ &=(x-1)^n \sum\limits_{i=0}^n w_i (\dfrac{x+1}{x-1})^i\\ &=(x-1)^n \sum\limits_{i=0}^n w_i (1+\dfrac{2}{x-1})^i\\ \end{aligned} \]

\(W(x)\) 先復合 \(1+x\),再復合 \(\dfrac{-2}{1-x}\) 即可。

時間復雜度 \(O(n \log n)\)

ABC238Ex Removing People (3200)

首先可以考慮對每段位置統計次數,然而很難處理。

刪除很難搞,時間倒流變成加人。加入一個人 \(u\) 時令他面向一個方向,則該方向的鄰居 \(v\) 需要在原序列中面向 \(u\)

考慮區間 DP,設 \(f_{l,r}\)\(g_{l,r}\) 分別表示 \(l\) 位置和 \(r\) 位置已經放好人,放 \(l \sim r\) 間人的方案數及距離和。

\(c1=[S_l=R]+[S_r=L]\)\(c2_i=[S_l=R](i-l)+[S_r=L](r-i)\),則轉移:

\[f_{l,r}=\sum\limits_{i \in (l,r)} \dbinom{r-l-2}{i-l-1} c1 f_{l,i}f_{i,r} \]

\[g_{l,r}=\sum\limits_{i \in (l,r)} \dbinom{r-l-2}{i-l-1} [c2_i f_{l,i}f_{i,r}+c1 f_{l,i}g_{i,r}+c1 g_{l,i}f_{i,r}] \]

時間復雜度 \(O(n^3)\)

ARC135E Sequence of Multiples (3200)

看起來很不可做(單調遞增且無規律),但發現 \(i \mid A_i\),不妨從商下手。

\(B_i=\dfrac{A_i}{i}\),則有 \(B_{i+1}=\lfloor \dfrac{iB_i}{i+1} \rfloor +1=B_i+1-\lceil \dfrac{B_i}{i+1} \rceil\)

故有 \(B_i-B_{i+1}=\lceil \dfrac{B_i}{i+1} \rceil-1\),當 \(B_i \leq i+1\) 時值就不會再變了。

顯然 \(\{B_i\}\) 單調不增。考慮其上界,由於 \(A_i \leq X+2+3+\cdots+i<X+\dfrac{i(i+1)}{2}\),故 \(B_i < \dfrac{X}{i}+i\)

由均值不等式知 \(B_{2\sqrt{X}} \leq B_{\sqrt{X}}<2 \sqrt{X}\),故有 \(O(\sqrt{X})\) 的做法。

進一步優化,考慮按 \(B_i-B_{i+1}\) 分段。下面證明這樣段數不超過 \(O(X^{1/3})\)

  • \(n=\lceil X^{1/3} \rceil\),則 \(n\) 前至多 \(n\) 段;又 \(B_n-B_{n+1} \leq n\)\(n\) 后至多 \(n\) 段。故總段數不超過 \(O(X^{1/3})\)

具體實現,假設段首為 \(l\),設 \(x=\lceil \dfrac{B_i}{i+1} \rceil\),則對於 \(r\)\(x=\lceil \dfrac{B_l-(r-l)(x-1)}{r+1} \rceil\),解得 \(r=\lfloor \dfrac{B_l+lx-x+1}{2x-1} \rfloor\)

總時間復雜度 \(O(X^{1/3})\)

ARC136F Flip Cells (3600)

和 ARC133F 聯動

停時定理設勢函數的做法做不了,因為值域有限,方程無解。

其實對於算停時的題還有另一種做法(參見 【UER #6】逃跑)。設出三個概率型生成函數:

  • \(F(x)\)\(f_t\) 表示由初始狀態開始,操作 \(t\) 次以后正好是第一次到達目標狀態的概率。(答案即為 \(F'(1)\)

  • \(G(x)\)\(g_t\) 表示由初始狀態開始,操作 \(t\) 次以后到達目標狀態的概率。

  • \(H(x)\)\(h_t\) 表示由目標狀態開始,操作 \(t\) 次以后到達目標狀態的概率。

由定義,有 \(F(x)=G(x)H(x)\)。只需要求出 \(G(x)\)\(H(x)\) 即可得到 \(F(x)\)

\(G(x)\) 為例。發現這個問題跟 ARC133F 幾乎一模一樣很相似,同樣對每個格子設出其翻轉偶數次及奇數次的指數型生成函數:

\[\hat P(x)=\sum\limits_{2 \mid i} \dfrac{(x/nm)^i}{i!} = \dfrac{e^{x/nm}+e^{-x/nm}}{2} \]

\[\hat Q(x)=\sum\limits_{2 \nmid i} \dfrac{(x/nm)^i}{i!} = \dfrac{e^{x/nm}-e^{-x/nm}}{2} \]

對於確定的初末狀態(指每個格子都已確定),直接將所有對應的生成函數卷起來即可。

然而我們現在只有初始狀態,末狀態可能有很多種(因為只給定了每行黑格的個數而不是具體方案)。直接對每一行 DP 求出每個指數對應的方案數,再把每一行暴力卷起來得到最終每個指數對應的方案數。(DP 復雜度為 \(O(nm^3)\),卷起來復雜度為 \(O(n^2m^2)\)

處理完后,只需要把 \(\sum\limits_{i=-nm}^{nm} c_i \hat P^{i/nm} \hat Q^{1-i/nm}\) 展開即可。這里與 ARC133F 完全一樣,直接背包 \(O(n^2m^2)\),分治乘可以優化到 \(O(nm \log nm)\)

最后需要計算答案。上面計算的是 \(\hat F(x)\) 的指數型生成函數,將所有 \(e^{ax}\) 改為 \(\dfrac{1}{1-ax}\) 即可轉為普通冪級數。

考慮到 \(H'(x)=\Big( \dfrac{F(x)}{G(x)} \Big)'=\dfrac{F'(x)G(x)-F(x)G'(x)}{G(x)^2}\),需要求出 \(F(1)\)\(F'(1)\)

然而 \(F(x)\) 中含有 \(\dfrac{1}{1-x}\) 項,直接將 \(x=1\) 帶入 \(F'(x)\) 中會出問題。

\(F(x)\)\(G(x)\) 同時乘上 \((1-x)\)。則只有 \((1-x)/(1-x)\) 項對 \(F(1)\) 有貢獻,而 \(F'(1)\) 的貢獻可以這樣求:

\[\left. \dfrac{d}{dx} \Big(\dfrac{1-x}{1-ax}\Big) \right |_{x=1}=\dfrac{1}{a-1} \]

總時間復雜度 \(O(n^3m+n^2m^2)\)

ABC241Ex Card Deck Score (2900)

大力寫出生成函數:

\[ANS=[x^m]\prod\limits_{i=1}^n \sum\limits_{j=0}^{B_i} (A_ix)^j=[x^m]\prod\limits_{i=1}^n \dfrac{1-(A_ix)^{B_i+1}}{1-A_ix} \]

\(m\) 特別大,但是 \(n\) 很小,分子可以暴力拆開,然而分母難以處理。

用部分分式分解,設 \(\prod\limits_{i=1}^n \dfrac{1}{1-A_ix}=\sum\limits_{i=1}^n c_i \dfrac{1}{1-A_ix}\)。解出后即可枚舉每一項計算答案。

考慮如何計算 \(c_i\)。暴力展開兩邊:

\[1=\sum\limits_{i=1}^n c_i \prod\limits_{j \neq i} (1-A_jx) \]

帶入 \(x=A_i^{-1}\),則有:

\[1=c_i \prod\limits_{j \neq i} (1-A_jA_i^{-1}) \]

可以 \(O(n^2)\) 解出。

總時間復雜度 \(O(n^2+n2^n)\)

ABC231G Balls in Boxes (2600)

設操作后第 \(i\) 個球增加了 \(c_i\)。則乘積為:

\[\prod\limits_{i=1}^n (A_i+c_i)=\sum\limits_{S \in [n]} (\prod\limits_{t \in S} A_t) (\prod\limits_{t \in [n] \setminus S} c_t)=\sum\limits_{m=0}^n p_mq_{n-m} \]

其中 \(p_m\) 為任選 \(m\)\(A_t\) 的乘積,可以用背包或者分治乘算出。

接下來只需要算 \(q_m\),即任選 \(m\) 個隨機變量 \(c_t\) 的乘積的期望。

不妨設這 \(m\) 個隨機變量就是前 \(m\) 個隨機變量(其余情況期望相同)。


Sol 1

\(f_{t,i}\) 表示第 \(t\) 次是否選擇第 \(i\) 個球,可以畫出 \(k \times n\) 的表。

等價於將前 \(m\) 個隨機變量的和乘起來。將括號拆開,等價於選出有順序\(m\)\(j_1,\cdots,j_n\),並對 \(\prod\limits_{t=1}^m f_{t,j_t}\) 求和。

這個東西是容易的。因為若 \(j_t\) 中有相同的數,則一定為 \(0\)(因為一次只能選一個數);其它情況下則為 \(\dfrac{1}{n^m}\)

\(q_m=\dfrac{k^{\underline{m}}}{n^m}\)

Sol 2

設出 \(m\) 元生成函數,則答案即為 \(\Big(\dfrac{\partial^m}{\partial x_1 \cdots \partial x_m} (x_1+x_2+\cdots+x_m)^k\Big) (1,1,\cdots,1)\)

常數扔出來,設 \(G=(x_1+x_2+\cdots+x_m)\),考慮偏導:

\[\begin{aligned} \dfrac{\partial^m}{\partial x_1 \cdots \partial x_m} G^k &=k \dfrac{\partial^m}{\partial x_2 \cdots \partial x_m} G^{k-1}\\ &=k(k-1) \dfrac{\partial^m}{\partial x_3 \cdots \partial x_m} G^{k-2}\\ &=\cdots\\ &=k^{\underline{m}} \end{aligned} \]

故答案為 \(q_m=\dfrac{k^{\underline{m}}}{n^m}\)


總時間復雜度 \(O(n^2)\)\(O(n \log^2 n)\)

ARC101F Robots and Exits (2900)

假設每個機器人在二維平面內,每一步操作是向上或向右上移動一步,轉化為一張 DAG。路徑不交,用 LGV 引理解決。

然而終點 \(y_1,\cdots,y_k\) 沒有確定而且無法枚舉。考慮類似掃描線的 DP,一個個確定 \(y_i\),再計算下列行列式的和:

\[\begin{vmatrix} \dbinom{n}{y_1-x_1} & \dbinom{n}{y_2-x_1} & \cdots & \dbinom{n}{y_k-x_1}\\ \dbinom{n}{y_1-x_2} & \dbinom{n}{y_2-x_2} & \cdots & \dbinom{n}{y_k-x_2}\\ \vdots & \vdots & \ddots & \vdots\\ \dbinom{n}{y_1-x_k} & \dbinom{n}{y_2-x_k} & \cdots & \dbinom{n}{y_k-x_k}\\ \end{vmatrix} \]

轉移時需要枚舉最后一列拆開,需要對所有 \(\{x_1,\cdots,x_k\}\) 的子集求答案才能轉移。故設狀態為:

\[f_{S,t}=\sum\limits_{y_1<y_2<\cdots<y_{|S|} \leq t} det \Big( \dbinom{n}{y_j-x_{s_i}} \Big)_{i,j} \]

其中 \(s_i\)\(S\) 中第 \(i\) 大的元素。

轉移時,分 \(y_{|S|}\) 是否為 \(t\) 轉移:

\[f_{S,t}=f_{S,t-1}+\sum\limits_{i=1}^{|S|} (-1)^{|S|-i} \dbinom{n}{y_{|S|}-x_{s_i}} f_{S \setminus \{s_i\},t-1} \]

邊界情況為 \(f_{S,- \infty}=[S= \emptyset]\)

總時間復雜度 \(O(k 2^k (x_k+n)\)

ABC242Ex Random Painting (2800)

設一個狀態為集合 \(S \subseteq \{(l_i,r_i) \mid i \in [1,m]\}\),稱一個狀態合法如果它覆蓋了 \([1,n]\)。原過程相當於不斷轉移狀態,直到狀態合法。

狀態轉移形成 DAG,用 ZJOI2020 抽卡 的套路,停時期望等於所有非法狀態 出現的概率 乘上 離開該狀態期望時間 的和。

大小為 \(k\) 的集合 走出該狀態期望時間 為 \(\dfrac{m}{m-k}\)。故只需對每個 \(k\) 求大小為 \(k\) 的合法狀態數量 \(f_k\)

大力 DP,先將所有區間按字典序排序(先 \(l\)\(r\)),設 \(f_{i,j,k}\) 表示考慮前 \(i\) 個區間,覆蓋了 \([1,j]\) 的所有格子,大小為 \(k\) 的狀態數量。

直接轉移時間復雜度 \(O(nm^2)\)

注意到第三維 \(k\) 與給出的區間無關。設 \(F(x)=\sum\limits_{i=0}^m f_i x^i\),對於常數 C 可以通過同樣的 DP 得到 \(F(C)\)

\(n\) 較大時,需要用動態開點線段樹記錄第二維 \(j\) 優化轉移,單次 DP 時間復雜度 \(O(m \log n)\)

\(m+2\) 次 DP 得到 \(m+2\) 個點值,插值還原 \(\{f_i\}\),時間復雜度 \(O(m^2 \log n)\)

ARC124F Chance Meeting (3200)

為了方便,設 \(n=H-1\)\(m=W-1\)

容易發現 Camel 向下走與 Cat 向上走對於兩人(?)的相對位置而言是等價的。將其視為同一個操作,最后乘上 \(\dbinom{2n}{n}\) 即可。於是問題變為了:

\((0,0)\) 出發,每次可以向上/左/右走一步,向上走 \(2n\) 步,向左與右各走 \(m\) 步后到達 \((0,2n)\)。求在過程中恰好經過 \((0,n)\) 一次的方案數。

重點是恰好的限制,考慮容斥。

\(f_i\) 表示向上走 \(n\) 步,向左/右各走 \(i\) 步后第一次到達 \((0,n)\) 的方案數,\(g_i\) 表示向上走 \(n\) 步,向左/右各走 \(i\) 步后到達 \((0,n)\) 的方案數。顯然 \(g_i=\dbinom{n+2i}{n,i,i}\)

答案即為 \(\dbinom{2n}{n} \sum\limits_{i=0}^m f_i f_{m-i}\)

Sol1(官方題解)

考慮用 \(g_i\) 減去不合法方案得到 \(f_i\)。枚舉上一次經過 \((0,n)\) 是在 \(g_j\),要求這 \(2(i-j)\) 步都不能經過 \((0,n)\),也就是卡特蘭數 \(C_{i-j-1}\)

\[f_i=g_i-\sum\limits_{j=0}^{i-1} g_j C_{i-j-1} \]

可以卷積處理,時間復雜度 \(O(n \log n)\)

Sol2

經典套路,再設 \(h_i\) 表示從 \((0,n)\) 向左/右各走 \(i\) 步回到 \((0,n)\) 的方案數,有 \(h_i=\dbinom{2i}{i}\)\(H(x)=(1-4x)^{-1/2}\)(見 (搜索 取一半組合數))。

顯然 \(G=FH\),於是:

\[F^2=\dfrac{G^2}{H^2}=(1-4x)G^2 \]

由於只算第 \(m\) 項,可以直接拆開計算。

時間復雜度 \(O(n)\)

Sol3(搜索 ARC124F)

ABC245Ex Product Modulo 2 (3000)

\(M\) 分解質因數 \(M=p_1^{e_1} p_2^{e_2} \cdots\),顯然每種質因數獨立,故只需對 \(m=p^e\)\(n=N \bmod p^e\) 求原問題答案,再乘起來即可。

\(n=x p^d (p \nmid x)\)

先考慮 \(x \neq 0\) 的情況。欽定序列中恰好有 \(d\)\(p\),這里的方案數為 \(\dbinom{k+d-1}{d}\)。在該條件下,得到的 \(n\) 的集合為 \(S=\{sp^d \mid (s,p^{e-d})=1\}\),又由歐拉定理 \(a^{\varphi(p)} \equiv a \pmod p((a,p)=1)\),得到每個 \(n\) 的概率都是一樣的,算出總方案再除掉 \(|S|\) 即可。

\(c_i\) 表示 \(A_i\)\(p\) 的次數,則 \(p\) 以外的數的選擇方案數為:

\[\prod\limits_{i=1}^k p^{e-c_i-1} (p-1)=p^{ke-k-d} (p-1)^k \]

故得到 \(n=x p^d\) 的方案數為:

\[\dbinom{k+d-1}{d}\dfrac{p^{ke-k-d} (p-1)^k}{p^{e-d-1}(p-1)}=\dbinom{k+d-1}{d}p^{(k-1)(e-1)}(p-1)^{k-1} \]

對於 \(x=0\) 的情況,說明 \(p\) 的次數大於等於 \(k\)。考慮容斥,用全部方案數減去不合法方案數,即:

\[p^{ek}-\sum\limits_{d=0}^{e-1} \dbinom{k+d-1}{d} p^{ke-k-d} (p-1)^k \]

瓶頸在於分解質因數,此處時間復雜度 \(O(\sqrt m)\)

ARC126E Infinite Operations (2800)

不知道為什么發現答案即為 \(f(A_1,A_2,\cdots,A_n)=\dfrac{1}{2} \sum\limits_{1 \leq i<j \leq n} |A_i-A_j|\),可以簡單對方差歸納證明:

  • 不妨設 \(A_1<A_2<\cdots<A_n\)。若 \(A_1=A_n\) 則答案為 \(0\),顯然成立。否則選擇 \(t \in [1,n)\) 使得 \(A_t<A_{t+1}\)

  • \(A_t\)\(A_{t+1}\) 變為 \((A_t+A_{t+1})/2\),方差嚴格變小。由歸納假設這樣構造得到的貢獻為(\(f\) 只是記號,簡寫式子):

\[f(A_1,\cdots,\dfrac{A_t+A_{t+1}}{2},\dfrac{A_t+A_{t+1}}{2},\cdots,A_n)+\dfrac{A_{t+1}-A_t}{2}=f(A_1,A_2,\cdots,A_n) \]

(即合並 \(t\)\(t+1\)\(t\)\(t+1\) 以外的點沒有影響,只少了 \((A_{t+1}-A_t)/2\) 的貢獻)

於是用動態開點線段樹維護即可。

時間復雜度 \(O((n+q) \log A_i)\)

ARC126F Affine Sort (3500)

考慮 \(c \leq k\) 的限制有點奇怪,記 \(g(k)\) 表示 \(c=k\) 時的合法 \((a,b,c)\) 對數,則 \(f(k)=\sum\limits_{i=1}^k g(i)\)

可以證明 \(\dfrac{g(k)}{k^2}\)\(k \rightarrow +\infty\) 時存在極限,設其為 \(c\)。則 \(g(k) \rightarrow ck^2\)\(f(k) \rightarrow \dfrac{1}{3}ck^3\),有 \(\lim\limits_{k \rightarrow +\infty} \dfrac{f(k)}{k^3}=\dfrac{1}{3}c\)

問題簡化為了求 \(\lim\limits_{k \rightarrow +\infty} \dfrac{g(k)}{k^2}\)。限制要求 \((aX_i+b) \bmod k\) 單增,不妨轉化為 \(\dfrac{(aX_i+b) \bmod k}{k}\) 單增。而當 \(k\) 足夠大時該問題近似是連續的,故可以直接視其為 \(\{\dfrac{aX_i+b}{k}\}=\{\alpha X_i+\beta\}\)。需要對滿足條件的 \((\alpha,\beta)(\alpha,\beta \in [0,1))\) 求二元積分。

為方便設 \(X_{0}=X_n\)。先不考慮 \(\beta\),假設對於某一 \(\alpha\),將 \(\{\alpha X_i\}\) 畫在一個長為 \(1\) 的圓周(每個點代表 \([0,1)\) 的數,順時針增大)上,則必要條件是畫出的點依次順時針排列(即 \(P_i\) 的前驅為 \(P_{i-1}\),后繼為 \(P_{i+1}\))。

換句話說,設 \(f(\alpha)=\sum\limits_{i=1}^n \{\alpha(X_i-X_{i-1})\}\),則 \(\alpha\) 合法的充要條件為 \(f(\alpha)=1\)(即從頭到尾只能轉一圈)。

再考慮對於一個合法的 \(\alpha\)\(\beta\) 需要滿足 \(\beta+\{\alpha X_1\} \geq 1\)\(\beta+\{\alpha X_n\}<1\),故其區間長度為 \(\{\alpha(X_1-X_n)\}\)

具體而言,枚舉每個 \(i\)\(\{\alpha(X_i-X_{i-1})\}\) 是一個分段函數,形如 \(\{\alpha(X_i-X_{i-1})\}=\alpha(X_i-X_{i-1})+d_t(\alpha \in [l_t,r_t])\),而段數只有約 \(O(|X_i-X_{i-1}|)\) 個。

又所有斜率加起來為 \(\sum\limits_{i=1}^n (X_i-X_{i-1})=0\),故 \(f(\alpha)\) 也是一個分段函數,且每一段都為常數,而段數為大約 \(S=\sum\limits_{i=1}^n |X_i-X_{i-1}|\)。枚舉每一段,\(\beta\) 的合法區間長度形如一次函數,對 \(\beta\) 積分即可。

時間復雜度 \(O(S \log S)\)

ARC128F Game against Robot (3800)

不看題解做出銀牌題,可喜可賀

下面設 \(n=N/2\)

先考慮如何判斷給定排列 \(p\) 的答案。顯然直接貪心吃最大是錯的,因為 \(B\) 的策略是固定(而不是最優)的,\(A\) 選較小值可能可以使 \(B\) 選較小值從而增大 \(A\) 的收益。

\(a\) 中的數按 \(p\) 排列成一排,則 \(B\) 會優先燒最靠前的數。先不考慮每個數的權值,來考慮 \(A\) 最后能吃到哪些數。

  • 其中一個答案是:設 \(s_i\) 表示 前 \(i\) 個數中 Snuke 吃掉的數量,則其合法當且僅當 \(\forall i,s_i \leq i-s_i+1\)。然而這個性質難以計算答案。

  • 換一種想法,設 \(A\) 最后吃的數為 \(1 \leq b_1<b_2<\cdots<b_n \leq 2n\),則其合法的充要條件為 \(\forall i,b_i \geq 2i-1\)。利用這個性質,從后往前維護優先隊列,每次加入序列末尾兩個數並刪掉優先隊列的最大數,操作 \(n\) 次后所有刪掉的數的和即為答案。

由於是枚舉所有排列,具有對稱性,因此可以將整個序列翻轉,改為從前往后維護優先隊列。

考慮原問題。由上面過程可以看到 \(A\) 的策略與 \(a_i\) 的具體值無關,只與大小關系有關。先將 \(a\) 從大到小排序,求出第 \(i\) 大數在所有情況中被選中的次數 \(f_i\),則答案即為 \(\sum\limits_{i=1}^{2n} a_if_i\)


恰好不好求,改為求 \(g_m\) 表示前 \(m\) 大的數在所有情況中被選中的次數之和。將前 \(m\) 大的數染黑,那么對於一個排列 \(p\) 只需要考慮選了多少個黑數,下面對黑白序列計算,再乘上 \(m!(2n-m)!\) 即可。

設第 \(t\) 次向優先隊列中加的黑數數量為 \(c_t \in [0,2]\)\(\sum\limits_{t=1}^{2n} c_t=m\)。設 \(x\) 為優先隊列的大小,則每次 \(x \leftarrow \max(0,x+c_t-1)\)

\(d_t=c_t-1\),看作在網格圖上移動:從 \((0,0)\) 出發,每次向右走一步,向上走 \(d_t\) 步,若跨越 \(x\) 軸就強行貼着 \(x\) 軸走(圖中的紅邊)。

則紅邊對應着刪去白數,數出所有情況中紅邊的總數,容斥即可得到刪去黑數的總數。

強行不跨越 \(x\) 軸的操作看起來很奇怪,若允許跨越 \(x\) 軸,則最后會走到 \((n,m-n)\)

發現紅邊即對應走到前綴最小值處。而每次前綴最小值只會減少 \(1\),故紅邊的數量是最低點縱坐標的相反數


引理:從 \((0,0)\) 走到 \((n,m)\),每次可以向右上/右/右下走,方案數分別為 \(1,2,1\)。則路徑方案數總數為 \(\dbinom{2n}{n+m}\)

證明:

\[\begin{aligned} ANS &=[x^m](x+2+x^{-1})^n\\ &=[x^m]x^{-n}(x^2+2x+1)^n\\ &=[x^{m+n}](x+1)^{2n}\\ &=\dbinom{2n}{n+m}\\ \end{aligned} \]

\(p_{m,k},q_{m,k}(k \in [-n,\min(0,m-n)])\) 分別表示最小值 等於大於等於 \(k\) 的路徑方案數總數。用類似卡特蘭數的套路,有:

\[q_{m,k}=\dbinom{2n}{m-n+n}-\dbinom{2n}{2(k-1)-m+n+n}=\dbinom{2n}{m}-\dbinom{2n}{m-2k+2} \]

\[p_{m,k}=q_{m,k+1}-q_{m,k}=\dbinom{2n}{m-2k}-\dbinom{2n}{m-2k+2} \]

\(-lim=\min(0,n-m),lim=\max(0,m-n)\),有:

\[\begin{aligned} \dfrac{g_m}{m!(2n-m)!}&=\sum\limits_{k=-n}^{-lim} (n+k) \Big[\dbinom{2n}{m-2k}-\dbinom{2n}{m-2k+2} \Big]\\ &=n\sum\limits_{k=-n}^{-lim} \Big[\dbinom{2n}{m-2k}-\dbinom{2n}{m-2k+2} \Big]+\sum\limits_{k=-n}^{-lim} k \Big[\dbinom{2n}{m-2k}-\dbinom{2n}{m-2k+2} \Big]\\ &=n \dbinom{2n}{m+2lim}-\sum\limits_{k=lim}^{n} k \Big[\dbinom{2n}{m+2k}-\dbinom{2n}{m+2k+2} \Big]\\ &=n \dbinom{2n}{m+2lim}-\sum\limits_{k=lim} k \dbinom{2n}{m+2k}+\sum\limits_{k=lim} k \dbinom{2n}{m+2k+2}\\ &=n \dbinom{2n}{m+2lim}-\sum\limits_{k=lim} k \dbinom{2n}{m+2k}+\sum\limits_{k=lim+1} (k-1) \dbinom{2n}{m+2k}\\ &=n \dbinom{2n}{m+2lim}-lim \dbinom{2n}{m+2lim}-\sum\limits_{k=lim+1}^n \dbinom{2n}{m+2k}\\ \end{aligned} \]

預處理即可 \(O(1)\) 計算,該部分復雜度 \(O(n)\)

總時間復雜度 \(O(n+\text{sort})\)

ARC115E LEQ and NEQ (2400)

對條件容斥,於是就變成了划分問題。

注意到一段的權值只與最小值有關,於是建出笛卡爾樹類似 CDQ 分治 DP 即可。

使用差分及前綴和優化即可做到 \(O(n)\)

ARC112E Cigar Box (2700)

考慮操作對序列的影響是怎樣的。顯然最后的狀態只與 每個數最后一次操作被放在哪一邊有關,故對每個數考慮其最后一次操作,稱其為關鍵操作

設共 \(L\) 個數最后被操作到左邊,\(R\) 個數最后被操作到右邊,顯然這 \(L\) 個數必須是 \(a_1,a_2,\cdots,a_L\)(並且它們對應關鍵操作的時間必須單增),這 \(R\) 個數必須是 \(a_{n-R+1},a_{n-R+2},\cdots,a_n\)(並且它們對應關鍵操作的時間必須單減),而中間 \(a_{L+1},a_{L+2},\cdots,a_{n-R}\) 必須單調遞增。

於是,倒序考慮每個操作,只需要確定以下信息,就可以唯一對應到一種操作序列:

  • 關鍵操作是哪些,它們的方向分別是哪里。
  • 對於每個非關鍵操作,其操作的是哪個數(該數必須已經被關鍵操作過了)。

考慮 DP,設 \(f_{i,L,R}\) 表示確定了 \(i\) 個操作,其中有 \(L\) 個向左的關鍵操作,\(R\) 個向右的關鍵操作的方案數。

\[f_{i+1,L+1,R} \leftarrow f_{i,L,R}, \, f_{i+1,L,R+1} \leftarrow f_{i,L,R} \]

\[f_{i+1,L,R} \leftarrow 2(L+R) f_{i,L,R} \]

注意到系數只與 \(L+R\) 有關,即只關心總關鍵操作個數。故將狀態改為總關鍵操作個數,設 \(f_{i,L,R}=g_{i,L+R}\dbinom{L+R}{L}\),同樣轉移即可。

最后將對所有滿足 \(a_l<a_{l+1}<\cdots<a_r\)\(f_{i,l-1,n-r}\) 求和即可。

時間復雜度 \(O(nm)\)

ARC124E Pass to Next (3000)

設第 \(i\) 個人給出了 \(b_i\) 個球,則傳球后第 \(i\) 個人有 \(a_i-b_i+b_{i-1}\) 個球。

注意到傳球后的狀態與 \(b_i-b_{i-1}\) 有關,若 \(\min b_i>0\),將所有 \(b_i\) 減去 \(1\) 后狀態不變;另一方面,若 \(\min b_i=0\),則其對應的狀態是唯一的。故用總方案減去限制 \(\forall i,b_i>0\) 的方案數即為答案。

以總方案為例,所求即為:

\[\sum\limits_{\{b_i\},b_i \leq a_i} \prod\limits_{i=1}^n (b_{i-1}+a_i-b_i) \]

考慮拆括號。每個位置只會被覆蓋 \(0/1/2\) 次,這取決於兩端括號的選擇。

用 DP 描述括號的選擇。先斷環為鏈,確定 \((b_n+a_1-b_1)\) 的選擇。設 \(f_{i,id}\) 表示前 \(i\) 個括號(即統計到 \((b_{i-1}+a_i-b_i)\)),第 \(i\) 個括號選擇哪邊(\(id=0\) 為左邊 \(b_{i-1}\),否則為右邊 \(a_i-b_i\)),所有選擇方案對應的和。其中若 \(id=0\) 則計算該括號的貢獻,否則不計算

\[f_{i+1,0} \leftarrow \Big(\sum\limits_{b_i=0}^{a_i} b_i \Big) f_{i,0} \]

\[f_{i+1,1} \leftarrow \Big(\sum\limits_{b_i=0}^{a_i} 1 \Big) a_i f_{i,0} \]

\[f_{i+1,0} \leftarrow \Big(\sum\limits_{b_i=0}^{a_i} b_i(a_i-b_i) \Big) f_{i,1} \]

\[f_{i+1,1} \leftarrow \Big(\sum\limits_{b_i=0}^{a_i} (a_i-b_i) \Big) f_{i,1} \]

統計與最初確定的 \((b_n+a_1-b_1)\) 選擇符合的狀態求和即可得到答案。

總時間復雜度 \(O(n)\)

ARC131F ARC Stamp (3500)

考慮給定某個初狀態如何判斷合法。考慮倒推,每次將一個 ARC 變成 ???,表示該位可以任意填。

容易發現每次可以將 \(6\) 種子區間變成 ???:ARC,?RC,??C,AR?,A??,?R?。(A?C 不會在過程中出現)

將給出的 \(T\) 分解成 ARC,RC,C,AR,A,R,於是每次占領一定是占領某一段。

考慮 DP,可以設 \(f_{i,j,id}\) 表示考慮前 \(i\) 段,最少操作次數為 \(j\),是否選第 \(i\) 段的方案數。然而直接轉移會算重,例如 [ARC][RC] 中,對於 \(S\) 為 ARCRC 及 ARCAA 兩種情況,在考慮 [ARC] 時並不知道 [RC] 是否要占領,於是也不知道是否要統計步數。

\(f_{i,j,id}\) 表示考慮前 \(i\) 段,最少操作次數為 \(j\),第 \(i\) 段與第 \(i+1\) 段是否都占領的方案數。

在轉移時,需要考慮該轉移是否是必要的。

這里以 [ARC] 的轉移為例:

  • \(f_{i,j,0} \leftarrow f_{i-1,j,0}\),不占領。

  • \(f_{i,j+1,1} \leftarrow 27f_{i-1,j,0}\),占領,且這步必要(前一步依賴)。

  • \(f_{i,j+1,0} \leftarrow 27f_{i-1,j,1}\),占領,且這步必要(后一步依賴)。

  • \(f_{i,j+1,1} \leftarrow 27f_{i-1,j,1}\),占領,且這步必要(前后一步依賴)。

  • \(f_{i,j+1,0} \leftarrow 26f_{i-1,j,0}\),只占領 \(i\) 而不占領前后,這步不必要。

注意上述轉移在兩個 [ARC] 間會算重(因為 [ARC] 不需要依賴前后),手動在 [ARC] 間加入間隔符 [X] 即可。

總時間復雜度 \(O(|T|k)\)

ARC138E Decreasing Subsequence (3600)

妙妙雙射題?

考慮一張 \(n+1\) 個點的有向圖,對所有 \(A_i>0\) 連邊 \((i,A_i-1)\)

顯然這張圖只能由大連向小,由若干條鏈構成。長度為 \(k\) 的下降子序列對應着關鍵邊 \((R_1,L_1),\cdots,(R_k,L_k)(L_1 \leq \cdots \leq L_k \leq R_k \leq \cdots \leq R_1)\),且這些邊都在不同的鏈里。

\(k\) 條關鍵邊所在的鏈拎出來,並用每條關鍵邊將其所在的鏈割成兩半。設所有在 \(L_i\) 一側的點集為 \(A\),所有在 \(R_i\) 一側的點集為 \(B\),顯然 \(\max \{A\}<\min \{B\}\)

注意到:對於每個 \(\max \{A\}<\min \{B\}\)\((A,B)\) 及將 \(A\)\(B\) 連成 \(k\) 條鏈的方案,有且僅有唯一的連關鍵邊方式 \((R_1,L_1),\cdots,(R_k,L_k)\) 使得 \(L_1 \leq \cdots \leq L_k \leq R_k \leq \cdots \leq R_1\)

於是只需要預處理 \(f_{i,j}\) 表示將 \(i+1\) 個點連成 \(j\) 條鏈的方案數。枚舉 \(|A|=x\)\(|B|=y\),則選擇 \((A,B)\) 的方案數為 \(\dbinom{n+1}{x+y}\),即可快速計算。

時間復雜度 \(O(n^2)\)

ARC107D Number of Multisets (2100)

\(f_{i,j}\) 表示用 \(i\) 個數湊出 \(j\) 的方案數。

考慮轉移,要么去掉一個 \(1\)(如果當前狀態有 \(1\)),要么全部乘 \(2\)(如果當前狀態沒有 \(1\)),即:

\[f_{i,j}=f_{i-1,j-1}+f_{i,2j} \]

時間復雜度 \(O(n^2)\)

ARC116D I Wanna Win The Game (1700)

\(f_{i}\) 表示 \(n\) 個數和為 \(i\),異或和為 \(0\) 的方案數。顯然 \(i\) 必須為奇數。

考慮枚舉所有數的最后一位有 \(j\) 個是 \(1\)

\[f_{i}=\sum\limits_{2 \mid j,j \in [0,n]} \dbinom{n}{j} f_{(i-j)/2} \]

時間復雜度 \(O(n^2)\)

AGC022F Checkers (3600)

神仙題

  • \(O(n^5)\)

由於 \(X\) 太大,可以把 \(X^k\) 視作基底,每個數看作 \(n\) 維空間內的點。

\(u,v\) 的一次操作認為是新建一個點 \(t\) 連向 \(u\)\(v\),邊權分別為 \(2\)\(-1\),表示 \(t=2u-v\)

最后根到某點的路徑權積即為該點貢獻。貢獻一定形如 \(\pm 2^k\),下面計算每維貢獻的可重集,最后乘上可重排即可。

考慮從根向下 DP。設 \(f_{i,x,y}\) 表示共 \(i\) 個點,權值絕對值最大的點(設權為 \(\pm 2^k\),不關心 \(k\) 到底是多少)中有 \(x\) 個為正,\(y\) 個為負的方案數。

每次轉移枚舉 \(a\) 個權 \(2^k\) 的點分裂,\(b\) 個權 \(-2^k\) 的點分裂。注意 \(\pm 2^k\) 分裂后會產生 \(\pm 2^{k+1}\)\(\mp 2^k\),還可以繼續分裂,故讓它們完全分裂(之后不會再分裂)。

容易算出完全分裂后還剩下 \(x-a+b\)\(2^k\)\(y-b+a\)\(-2^k\),計入可重排里。故轉移:

\[f_{i+a+b,a,b} \leftarrow \dfrac{1}{(x-a+b)!(y-b+a)!} f_{i,x,y} \]

初始狀態 \(f_{1,1,0}=1\)\(Ans=n!f_{n,0,0}\)

時間復雜度 \(O(n^5)\),難以優化。但足以通過本題

  • \(O(n^4)\)

上面的做法瓶頸在於需要記錄最后一層的正負點個數。

考慮換一種建圖方式,將 \(-1\) 邊縮起來。即對 \(u,v\) 操作直接將 \(u\) 連向 \(v\)\(u\)\(v\) 的父親)。注意這里兒子有序。

此時一個點的貢獻絕對值為 \(2^{dep}\),符號取決於其 兒子個數+祖先左側兒子個數 的奇偶性。將每個點的符號與其父親差分即為 其兒子個數+父親右側兒子個數+\(1\)

下面稱有奇數個兒子的點為特殊的

仍然從上到下對每一層 DP,但由於符號與兒子個數相關需要改變狀態。設 \(f_{i,j}\) 表示共 \(i\) 個點,該層有 \(j\) 個特殊點 的方案數。

設下一層有 \(k\) 個點,若不考慮這些點中兒子個數對符號的影響,則每個父親的兒子符號從右到左是 \(-1,1,\cdots,-1/1\)。故 \(1\) 共有 \(\dfrac{k-j}{2}\) 個,而 \(-1\)\(\dfrac{k+j}{2}\)

設考慮這些點中兒子個數的影響后共有 \(t\) 個點為 \(1\)。注意到若有兩個特殊點權一正一負,可以令它們兒子個數變為偶數,不會影響權值。故令每一種方案唯一對應到 特殊點數量最少(即 \(|t-(k-j)/2|\) 個)的方案,不會算重。有轉移:

\[f_{i+k,|t-(k-j)/2|} \leftarrow \dfrac{1}{t!(k-t)!} f_{i,j} \]

初始狀態 \(f_{1,0}=f_{1,1}=1\)\(Ans=n!f_{n,0}\)

時間復雜度 \(O(n^4)\)

  • \(O(n^3)\)

先將上述轉移式改寫一下,令 \(x=t\)\(y=k-t\),則:

\[f_{i+x+y,|(x-y-j)/2|} \leftarrow \dfrac{1}{x!y!} f_{i,j} \]

注意到 \((i+x,x-j)\) 相同時轉移只與 \(y\) 有關。故分步轉移:

\[g_{i+x,x-j} \leftarrow \dfrac{1}{x!} f_{i,j} \]

\[f_{i+x+y,|(x-y-j)/2|} \leftarrow \dfrac{1}{y!} g_{i+x,x-j} \]

\[f_{A,|(B-y)/2|} \leftarrow \dfrac{1}{y!} g_{A,B} \]

注意轉移條件 \(x+y \geq \max(1,j)\)\(2 \mid x+y+j\)

時間復雜度 \(O(n^3)\)

ARC139D Priority Queue 2 (2800)

先把第 \(x\) 小改為第 \(n+1-x+1\) 大(即刪除后允許最大 \(n-x+1\) 個數留下)。

暴力枚舉值域,對每個 \(t \in [1,m]\) 計算最后 \(\geq t\) 的數的期望個數,最后相加即為答案。

設最開始時 \(\geq t\) 的數有 \(A\) 個,\(k\) 步中一共加入了 \(B\)\(\geq t\) 的數。則:

  • \(A \leq n-x+1\),則每次操作后 \(\geq t\) 的數始終不超過 \(n-x+1\) 個,故最后 \(\geq t\) 的數有 \(\min(A+B,n-x+1)\) 個。

  • \(A > n-x+1\),則每次操作后 \(\geq t\) 的數至少有 \(n-x+1\) 個,故最后 \(\geq t\) 的數有 \(\max(A+B-k,n-x+1)\) 個。

暴力枚舉 \(p\),乘上方案數即可。

預處理組合數及冪次可做到 \(O(n+mk)\)

ARC139E Wazir (3200)

\(n,m\) 均為偶數時,顯然最優方案為黑白間隔染色,方案數為 \(2\)

否則,可以選擇交換 \(n\)\(m\) 使得其二之一成立:

  • \(n\) 為偶數,\(m\) 為奇數。

  • \(n,m\) 均為奇數且 \(n \geq m\)

\(m\) 為奇數時,一行中最多能填 \(\dfrac{m-1}{2}\) 個,且此時有且僅有兩個相鄰的空位。

設第 \(i\) 行的空位位置為 \(p_i\),注意到:

\(i\) 行與第 \(i+1\) 行滿足要求當且僅當 \(p_{i+1}=p_i \pm 1 \pmod m\)

於是可以說明最優方案的黑格數為 \(\lfloor \dfrac{n}{2} \rfloor \dfrac{m-1}{2}\)

  • \(n\) 為偶數時,令 \(\{p_i\}=\{0,1,0,1,\cdots,0,1\}\)

  • \(n\) 為奇數(\(n \geq m\))時,令 \(\{p_i\}=\{0,1,0,1,\cdots,1,0,1,2,\cdots\,m-2,m-1\}\)

考慮算方案數。先假設 \(p_0=0\),最后再乘上 \(m\)。即求:

\[\sum\limits_{x+y=n} [m \mid x-y] \dbinom{n}{x} \]

\(n\) 較小時,暴力計算即可。

\(m\) 較小時,只需要計算:

\[(x+x^{-1})^n \pmod{x^m-1} \]

使用多項式快速冪及多項式取模即可。

總時間復雜度 \(O(\min(n,m) \log n \log m)\)

ARC127E Priority Queue (2700)

\(n=A\)\(m=B\)

考慮判斷終態 \(s_1,s_2,\cdots,s_{n-m}\) 是否可行。考慮倒推,倒着考慮每個操作:

  • 若遇到 \(1\) 操作,則從優先隊列中刪除一個數。

  • 若遇到 \(2\) 操作,則將一個未被加入過的數加入優先隊列,且要求該數比優先隊列中所有數都大

若存在一種操作方式完成所有操作,則終態合法。

不難發現最優策略下 \(1\) 操作刪除的數一定是最大的,而 \(2\) 操作加入的數會按照 \(s_{n-m}+1,s_{n-m}+2,\cdots,n,s_{n-m-1}+1,s_{n-m-2}+2,\cdots\) 的順序加入。

那么預處理出 \(p_i\) 表示刪掉 \(s_{n-m+1-i}\) 時(即第一次 \(cnt_1-cnt_2=i\))進行的 \(2\) 操作的數量。則 \(s_i\) 合法當且僅當 \(\forall i,n-s_{n-m+1-i}-i+1 \geq p_i\)(即 \(s_{n-m+1-i}\) 后面的空位數)。

即問題轉化為:

\(0 \leq a_1 \leq a_2 \leq \cdots \leq a_{n-m} \leq m\) 的數量使得 \(\forall i,a_i \geq p_i\)

可以直接 \(O(n^2)\) DP,也可參照 gym102978J Japanese Knowledge 用分治乘優化到 \(O(n \log^2 n)\)

真 · Japanese Knowledge

ABC249G Xor Cards (2800)

把卡片的 \(A_i\) 扔進線性基 \(P\) 里(線性基需記錄對應的 \(B_i\)),插不進去的將 \(B_i\) 放到另一個線性基 \(Q\) 里表示可以隨意用。

從高位向低位枚舉 \(P\) 中元素。記錄當前欽定選的 \(A_i\) 異或和 \(cur\)\(B_i\) 異或和 \(val\)。假設枚舉到第 \(i\) 位(\(cur_i,K_i\) 分別表示 \(cur\)\(K\) 在二進制下的第 \(i\) 位,\(P_i\) 表示 \(P\) 的第 \(i\) 位元素):

  • \(cur_i=0,K_i=0\),則必須不選,跳過。

  • \(cur_i=0,K_i=1\),若 \(P_i=0\) 則直接跳過;否則若欽定不選則 后面的位及 \(Q\) 可以任意選計入答案,若欽定選擇則繼續下一位。

  • \(cur_i=1,K_i=0\),則必須選,若 \(P_i=0\) 則退出,否則跳過。

  • \(cur_i=1,K_i=1\),若 \(P_i=0\) 則直接跳過;否則若欽定選則 后面的位及 \(Q\) 可以任意選計入答案,若欽定不選則繼續下一位。

最后若 \(cur=K\) 可以在 \(Q\) 中任意選計入答案。

判斷無解需要記錄目前 是否已經欽定選數 及 線性基里是否有元素。

預處理線性基可做到 \(O(n \log W+\log^2 W)\)

所以為什么官方題解和 User Editorial 都是三方的啊

ABC129Ex Dye Color (3500)

算停時,用 勢函數和鞅的停時定理

對每種顏色的出現次數 \(a_i\) 設勢函數 \(\varphi(x)\)。設 \(p_{i,j}\) 表示一次操作后某種顏色 \(X\) 出現次數由 \(i\) 變為 \(j\) 的概率,則我們希望:

\[1+\sum\limits_{i=1}^n \sum\limits_{j=0}^{a_i+1} p_{a_i,j} \varphi(j)=\sum\limits_{i=1}^n \varphi(a_i) \]

\[\varphi(i)=\sum\limits_{j=0}^{i+1} p_{i,j} \varphi(j)-\dfrac{1}{n}(i<n),\varphi(n)=0 \]

考慮計算 \(p_{i,j}\)。分兩種情況:

  • 選的顏色中沒有顏色 \(X\),則概率為:

\[\begin{aligned} S_1 &=\sum\limits_{t=0}^{n-i} \dfrac{1}{2^n} \dbinom{i}{i-j} \dbinom{n-i}{t} \dfrac{\dbinom{n-1}{(i-j+t)}}{\dbinom{n}{(i-j+t)}}\\ &=\dfrac{1}{2^n} \dbinom{i}{j} \sum\limits_{t=0}^{n-i} \dbinom{n-i}{t} \dfrac{n-(i-j+t)}{n}\\ &=\dfrac{1}{2^n} \dbinom{i}{j} \big [ (n-i+j)2^{n-i}-(n-i)2^{n-i-1} \big ]\\ \end{aligned} \]

  • 選的顏色中有顏色 \(X\)。則概率為:

\[\begin{aligned} S_2 &=\sum\limits_{t=0}^{n-i} \dfrac{1}{2^n} \dbinom{i}{i-j+1} \dbinom{n-i}{t} \dfrac{i-j+1+t}{n}\\ &=\dfrac{1}{2^n} \dbinom{i}{j-1} \big [ (i-j+1)2^{n-i}+(n-i)2^{n-i-1} \big ]\\ \end{aligned} \]

於是 \(p_{i,j}=S_1+S_2\) 可以 \(O(1)\) 算出。

由於是下海森堡矩陣,可以通過倒推 \(O(n^2)\) 消元並解出 \(\varphi(x)\),計算答案。

總時間復雜度 \(O(n^2)\)

ARC140F ABS Permutation (Count ver.) (3400)

先考慮 \(M=1\) 的情況。注意到滿足條件的位置連起來會將整個數組划分成一條條鏈,等價於數鏈的條數,而鏈是好處理的。

假如欽定了每一條鏈的位置(未填數),方案數容易計算。難點在於要求兩條不同的鏈不能相接

上容斥,設 \(f_i\) 表示滿足條件的位置恰好有 \(i\) 個,\(g_i\) 表示欽定有 \(n-i\) 條鏈(即有些滿足條件的位置可能不被計入),有:

\[g_k=\sum\limits_i \dbinom{i}{k} f_i \]

\[f_k=\sum\limits_i (-1)^{i-k} \dbinom{i}{k} g_i \]

該式直接差卷積即可。下面考慮如何算 \(g_k\)

\(g_k\) 的意義為:將長為 \(n\) 的數組划分為 \(k\)\(c_1,\cdots,c_k\),其權值為:

\[k! 2^{\sum\limits_{i} [c_i>1]} \]

\(g_k\) 即為所有划分方案的權值和。

可參照 CF1553I Stairs,使用分治乘(需要記錄兩端是否為 \(1\)),復雜度為 \(O(16 n \log^2 n)\)。這里由於是上述題目中 \(a_i\) 全為 \(1\) 的特殊情況,可以改為倍增 FFT,復雜度為 \(O(16 n \log n)\)

接下來考慮 \(M > 1\)。記 \(Q=P^{-1}\) 滿足 \(Q_{P_i}=i\)。則 \(|P_i-P_{i+1}|=M\) 等價於 \(|Q_i-Q_{i+M}|=1\)。又注意到位置可以隨意互換,故這個模型等價於若干條互相獨立的鏈。對每條鏈做 \(M=1\) 的倍增 NTT 再全部分治乘卷起來即可。

時間復雜度 \(O(16n \log n+n \log^2 n)\)

AGC057E RowCol/ColRow Sort (4100)

個人感覺這一場最有意思的題

考慮如何判斷一個矩陣是否合法。

由排序網絡的 0-1 原理,對於每個 \(k\),將不超過 \(k\) 的數塗黑,得到 \(A_k\)\(B_k\)。若 \(A_k\) 按兩種方式排序后都得到 \(B_k\),則合法。

記矩陣 \(M\) 的每行黑格子數的可重集為 \(R_M\),每列黑格子數的可重集為 \(C_M\)

引理:對於所有按行或按列排序后的 \(n\)\(m\) 列矩陣 \(M\)\(f:{R_M} \rightarrow C_M\) 構成雙射。
證明:不妨設 \(M\) 按行有序。將所有列按照黑格數量遞減排序,顯然 \(R_M\)\(C_M\) 不變,而此時 \(M\) 按列也有序,故 \(R_M\)\(C_M\) 唯一對應。

結論:矩陣 \(A\) 合法當且僅當 \(R_A=R_B,C_A=C_B\)
證明:將 \(A\) 按行排序后得到 \(A'\),有 \(R_A=R_{A'}\)。由於 \(A'\) 按列排序后得到 \(B\),故 \(C_{A'}=C_B\)。由引理,\(R_{A'}=R_B\),故 \(R_A=R_B\)。同理 \(C_A=C_B\),可證得必要性,而充分性顯然。

注意到顏色數很少,不妨按顏色分層。對於每個 \(k\),只需要計算出在 \(B_{k+1}\) 中填出 \(B_k\) 的方案數,全部相乘即可得到答案。即,將 \(B_{k+1}\) 按行列排序后得到 \(B'_{k+1}\),在黑格中選一些格子,選出的格子組成矩陣的 \(M\) 滿足 \(R_M=R_{B_{k}},C_M=C_{B_{k}}\)

由於引理,\(M\) 由且僅由 \(B_k\) 交換一些行列得到。不妨設行交換的排列為 \(p_1,\cdots,p_n\),列交換的排列為 \(q_1,\cdots,q_m\)。只需要滿足:

\[B_{k_{i,j}}=1 \Rightarrow B'_{k+1_{p_i,q_j}}=1 \]

\(a_i\) 表示 \(B_k\)\(i\) 行的黑格數,\(b_i\) 表示 \(B'_{k+1}\)\(j\) 列黑格數,則條件等價於:

\[j \leq a_i \Rightarrow p_i \leq b_{q_j} \]

\[\forall i \in [1,n],p_i \leq b_{\max\{q_1,q_2,\cdots,q_{a_i}\}} \]

注意到 \(\{a_i\}\)\(\{b_i\}\) 均單調不增,考慮按 \(x=\max\{q_1,q_2,\cdots,q_{a_i}\}\) 從后向前 DP。

\(f_{i,j}\) 表示 \(\max\{q_1,q_2,\cdots,q_i\}=j\) 的方案數,可以在轉移時維護 \(\{q_i\}\) 的方案數。再維護一個指針 \(t\),容易在 \(a_t=i\) 時計算 \(\{p_i\}\) 的方案數:

\[f_{i,j} \leftarrow (j-i+1) f_{i-1,j}+\sum\limits_{k<j} f_{i-1,k} \]

\[f_{i,j} \leftarrow (b_j-t+1) f_{i,j} \]

最后由於 \(R_k,C_k\) 中重復的數會被計算多次但方案是相同的,所以要除掉可重排。注意 \(a_i,b_j=0\) 的要刪掉,不然會算重。

前綴和優化可做到 \(O(nm+m^2)\)。總時間復雜度 \(O(B_{i,j}(nm+m^2))\)

ARC118E Avoid Permutations (3100)

從對每個 \(P\) 計算 \(f(P)\) 的角度來看十分不可做。由於可以從障礙中間穿過,只能用 DP 解決。

換一個角度,對每條路徑統計放障礙的方案數。障礙不能碰到路徑 的限制比較難辦,考慮容斥,欽定一部分障礙必須放在路徑上。

一邊 DP 一邊進行容斥。注意到最后需要根據欽定放障礙的數量來計算其它障礙的方案,並且兩行間的交界處會出現兩格子同列的情況。故設 \(f_{i,j,k,id_1}\) 表示在第 \(i\) 行走到第 \(j\) 列(下一步直接向下一行走),已經欽定放了 \(k\) 個障礙,障礙是否放在 \((i,j)\) 的權值。轉移需要枚舉下一行走到哪,復雜度 \(O(n^4)\)

在每一行轉移內部用分步 DP 來優化。將狀態改為 \(f_{i,j,k,id_1,id_2}\),表示在第 \(i\) 行走到第 \(j\) 列,已經欽定放了 \(k\) 個障礙,該行是否已放障礙,該列是否已放障礙的權值。轉移只需考慮相鄰的兩個格子,復雜度 \(O(n^3)\)

AGC053C Random Card Game (2900)

本文中認為每次操作拿走較大(而非較小)的牌,與原題等價。

容易發現被拿空的牌堆是確定的:\(1\) 號牌不可能被拿走。

設含有 \(1\) 號牌的牌堆為 \(A\),另一牌堆為 \(B\)

\(B\) 中的每張牌 \(B_i\) 都會被 \(A\) 中的某張牌 \(A_j\) 刪掉,且滿足 \(A_j<B_i\)。設最小滿足此條件的 \(j\)\(p_i\)

顯然下界為 \(n+\max \{p_i-i\}\),可以通過以下策略達到:

  • 若有 \(A_i<B_i\) 就對這樣的 \(i\) 中最大的 \(i\) 刪掉 \(B_i\)(故不會互相影響);否則就將 \(A_1\) 刪去(若 \(A_1\) 不能刪去則說明 \(A_1<B_1\),矛盾)。

這樣 \(B\) 中的每張卡能刪就刪,刪去 \(A_1\) 的次數就是 \(\max \{p_i-i\}\)

\(\max \{p_i-i\} \leq k\) 的概率為 \(f_k\),則答案為 \(2n-\sum\limits_{k=0}^{n-1} 2f_k\)(乘 \(2\) 是因為 \(A,B\) 可互換)。

即計算對所有 \(i \in [1,n]\),存在 \(j \in [1,\min(i+k,n)]\) 使得 \(A_j < B_i\) 的概率。記該事件為 \(C_i\),則:

\[\begin{aligned} f_k &= P(C_1 \cap C_2 \cap \cdots \cap C_n)\\ &= P(C_1) P(C_2 | C_1) P(C_3| C_1 \cap C_2) \cdots P(C_n | C_1 \cap \cdots \cap C_{n-1}) \end{aligned} \]

\(C_i | C_1 \cap \cdots \cap C_{i-1}\) 不成立當且僅當 \(B_i\)\(A_1,\cdots,A_{\min(i+k,n)},B_1,\cdots,B_i\) 中最小的(若存在 \(B_j \leq B_i\),由於 \(C_j\) 成立 \(C_i\) 也一定成立)。故概率為 \(1-\dfrac{1}{i+\min(i+k)}\)

\[f_k=\prod\limits_{i=1}^{n-k} \dfrac{2i+k-1}{2i+k} \prod\limits_{i=n-k+1}^{n} \dfrac{n+i-1}{n+i} \]

預處理后可以 \(O(1)\) 計算。總時間復雜度 \(O(n)\)

ARC133F Many Xor Optimization Problems (?)

q-analog 普及題

對於每個向量空間,求出其線性基並對主元位消元。

設主元位分別為 \(x_1,x_2,\cdots,x_k\),下面分成三部分計算:

  • 主元位 \(x_1,x_2,\cdots,x_k\) 對應的向量空間數量。

  • 主元位為 \(x_1,x_2,\cdots,x_k\) 的向量空間的最大子集異或和的期望值。

  • 主元位為 \(x_1,x_2,\cdots,x_k\) 的基底數量。

第一個問題顯然只與 \(k\) 有關。只需要數 \(k\) 維滿秩的向量空間數量即可。

這是一個經典問題,考慮每個向量空間一定可以進行 \(n\) 次以下步驟之一來唯一得到:

  • 添加一個與已有向量線性有關的向量。假設當前秩為 \(t\),則方案數為 \(2^t\)

  • 添加一個與已有向量線性無關的向量,使秩增加 \(1\)(需要恰好被進行 \(k\) 次)。假設當前秩為 \(t\),則方案數為 \(2^k-2^t\)

寫成生成函數即:

\[p_k=\prod\limits_{i=0}^{k-1} (2^m-2^i) [x^{n-k}] \prod\limits_{i=0}^k \dfrac{1}{1-2^ix} \]

前面數量容易計算,后面即 q-binomial 的形式,為 \(\dbinom{n}{k}_2\),可以遞推算出。該部分時間復雜度 \(O(m)\)

第二個問題,最大子集異或和就是所有基底的異或和。那么分每一位考慮,比 \(x_k\) 高的位全都為 \(0\),主元位必定為 \(1\),非主元位有一半的概率為 \(1\),故期望為:

\[\dfrac{2^{k+1}-1+\sum\limits_{i=1}^k 2^{x_i}}{2} \]

第三個問題,從低位到高位逐個確定每個基底。那么對於第 \(i\) 個基底,后面的 \(x_i\) 個位置有 \(i-1\) 個是主元位必須為 \(0\),其它都可以任意選。故方案數為:

\[\prod\limits_{i=1}^k 2^{x_i-(i-1)} \]


全部組合起來,答案為:

\[\sum\limits_{0 \leq x_1 \leq \cdots \leq x_k \leq m-1} p_k \dfrac{2^{k+1}-1+\sum\limits_{i=1}^k 2^{x_i}}{2} \prod\limits_{i=1}^k 2^{x_i-(i-1)}=\sum\limits_{k=1}^m p_k2^{-k(k-1)/2-1} \sum\limits_{0 \leq x_1 \leq \cdots \leq x_k \leq m-1} (2^{k+1}-1+\sum\limits_{i=1}^k 2^{x_i}) \prod\limits_{i=1}^k 2^x_i \]

那么只需要對每個 \(k\) 計算:

\[f_k=\sum\limits_{0 \leq x_1 \leq \cdots \leq x_k \leq m-1} \prod\limits_{i=1}^k 2^{x_i} \]

\[g_k=\sum\limits_{0 \leq x_1 \leq \cdots \leq x_k \leq m-1} (\sum\limits_{i=1}^k 2^{x_i}) \prod\limits_{i=1}^k 2^{x_i} \]

\[h_k=\sum\limits_{0 \leq x_1 \leq \cdots \leq x_k \leq m-1} x_k \prod\limits_{i=1}^k 2^{x_i} \]

先考慮 \(g_k\),巧妙變形:

\[\begin{aligned} g_k&=\sum\limits_{0 \leq x_1 \leq \cdots \leq x_k \leq m-1} (\sum\limits_{i=1}^k 2^{x_i}) \prod\limits_{i=1}^k 2^{x_i}\\ &=\sum\limits_{0 \leq x_1 \leq \cdots \leq x_k \leq m-1} (2^m-1-\sum\limits_{i \notin X} 2^{x_i}) \prod\limits_{i=1}^k 2^{x_i}\\ &=(2^m-1)f_k-(k+1) \sum\limits_{0 \leq x_1 \leq \cdots \leq x_{k+1} \leq m-1} \prod\limits_{i=1}^{k+1} 2^{x_i}\\ &=(2^m-1)f_k-g_{k+1}\\ \end{aligned} \]

於是只需快速計算 \(f_k\)\(h_k\) 即可。

\(f_k\) 寫出生成函數即:

\[F(x)=\prod\limits_{i=0}^{m-1} (1+2^ix) \]

還是 q-analog 那一套,代入 \(2x\)

\[(1+2^{m}x) F(2x)=(1+x) F(x) \]

\[f_i(2^i-1)=f_{i-1}(2^m-2^{i-1}) \]

線性遞推即可。

\(h_k\) 寫出生成函數即:

\[H(x)=\sum\limits_{k=0}^{m-1} 4^kx \prod\limits_{i=0}^{k-1} (1+2^ix) \]

\[\begin{aligned} H(2x)&=\sum\limits_{k=0}^{m-1} 4^k \cdot 2x \prod\limits_{i=0}^{k-1} (1+2^{i+1} x)\\ &=\dfrac{2}{4(1+x)} \sum\limits_{k=0}^{m-1} 4^{k+1} x \prod\limits_{i=0}^{k} (1+2^i x)\\ &=\dfrac{1}{2(1+x)} \sum\limits_{k=1}^{m} 4^{k} x \prod\limits_{i=0}^{k-1} (1+2^i x)\\ &=\dfrac{1}{2(1+x)} \Big[ \sum\limits_{k=0}^{m-1} 4^{k} x \prod\limits_{i=0}^{k-1} (1+2^i x) -1+4^mx \prod\limits_{i=0}^{m-1} (1+2^ix) \Big]\\ &=\dfrac{1}{2(1+x)} \Big[ \sum\limits_{k=0}^{m-1} 4^{k} x H(x)-1+4^mx F(x) \Big]\\ \end{aligned} \]

\[2(1+x)H(2x)=\sum\limits_{k=0}^{m-1} 4^{k} x H(x)-1+4^mx F(x) \]

\[(2^{i+1}-1) h_i=4^m f_{i-1}-2^i h_{i-1}-[i=1],i \geq 1 \]

同樣可以線性遞推。

總時間復雜度 \(O(m)\)

官方題解到處都是 NTT,錯過了普及 q-analog 的大好機會

AGC041D Problem Scores (3100)

顯然對於某個 \(k\),只需要考慮前綴 \(k+1\) 個數 \(pre_{k+1}\) 之和大於后綴 \(k\) 個數 \(suf_{n-k+1}\) 之和的限制。

\(s_k=pre_{k+1}-suf_{n-k+1}\),差分有 \(s_k-s_{k-1}=a_k-a_{n-k+1}\)。而 \(\{a_i\}\) 單調不降,故 \(k=\lfloor \dfrac{n-1}{2} \rfloor\)\(s_k\) 是最小的,只需考慮此限制即可。

由於要求 \(\{a_i\}\) 單調不降,設 \(\{a_i\}\) 的差分數組為 \(\{b_i\}\),考慮 \(b_i\)\(s_k\) 的貢獻:

  • \(n\) 為奇數:\(\{1,0,-1,-2,\cdots,-k+1 \ , \ -k,-k+1,\cdots,-1\}\)

  • \(n\) 為偶數:\(\{1,0,-1,-2,\cdots,-k+1 \ ,-k, \ -k,-k+1,\cdots,-1\}\)

記此貢獻系數為 \(c_i\)。可以看到 \(b_1\) 比較特殊,考慮枚舉 \(b_2,\cdots,b_n\) 再算 \(b_1\) 的取值方案數。限制即:

\[b_1 \leq n-\sum\limits_{i=2}^n b_i \]

\[b_1 > \sum\limits_{i=2}^n c_ib_i \]

\(b_1\)\(\max(0,n-\sum\limits_{i=2}^n (c_i+1) b_i)\) 種取值方案。

對所有 \((c_i+1)\) 做完全背包即可,時間復雜度 \(O(n^2)\)。可以同 P4389 付公主的背包 用分治乘優化到 \(O(n \log^2 n)\)

ARC111F Do you like query problems? (3100)

可以對每個位置分別考慮,可以線性得到貢獻為關於 \(x=i(n+1-i)\)\(q\) 次多項式,但無法避免插值(不過足以通過)。

更聰明的做法,首先對值域將期望拆成概率。枚舉 \(w \in [0,m)\),將所有 \(\geq w\) 的數視為 \(1\),其它數視為 \(0\),計算答案后全部求和即可得到原問題答案。

將修改和詢問分別考慮。考慮計算 \(t\) 次操作后第 \(i\) 個數為 \(1\) 的概率 \(f_{w,t,i}\)。注意到只有兩種修改會影響 \(a_i\) 的取值,稱作關鍵操作

  • 第一類操作,\(i \in [l,r],v<w\)

  • 第二類操作,\(i \in [l,r],v \geq w\)

於是 \(a_i\) 由最后一次關鍵操作決定。而一次操作為關鍵操作的概率為:

\[p_i=\dfrac{i(n-i+1)}{n(n+1)/2} \cdot \dfrac{2m}{2m+1} \cdot \dfrac{1}{2}(\dfrac{w}{m}+\dfrac{m-w}{m})=\dfrac{i(n-i+1)}{n(n+1)/2} \cdot \dfrac{m}{2m+1} \]

若前 \(t\) 次操作中沒有關鍵操作,則 \(a_i\)\(0\)。否則有 \(\dfrac{m-w}{m}\) 的概率 \(a_i\)\(1\)。故

\[f_{w,t,i}=\dfrac{m-w}{m}[1-(1-p_i)^t] \]

先在這里對 \(w\) 求和,有:

\[g_{t,i}=\sum\limits_{w=0}^{m-1} f_{w,t,i}=\dfrac{m-1}{2}[1-(1-p_i)^t] \]

考慮上一次操作為第三種操作(即詢問)的概率,答案即為:

\[\begin{aligned} Ans&=\sum\limits_{t=0}^{q-1} \sum\limits_{i=1}^n \dfrac{i(n-i+1)}{n(n+1)/2} \dfrac{1}{2m+1} \cdot \dfrac{m-1}{2}[1-(1-p_i)^t]\\ &=\sum\limits_{i=1}^n \dfrac{i(n-i+1)}{n(n+1)} \dfrac{m-1}{2m+1} \sum\limits_{t=0}^{q-1} [1-(1-p_i)^t]\\ &=\sum\limits_{i=1}^n \dfrac{i(n-i+1)}{n(n+1)} \dfrac{m-1}{2m+1} (q-\dfrac{1-(1-p_i)^q}{p_i})\\ \end{aligned} \]

預處理即可做到 \(O(n \log q)\)

AGC003F Fraction of Fractal (3300)

設迭代了 \(k\) 次的圖形為 \(G_k\)(初始圖形為 \(G_1\))。

考慮 \(G_2\),顯然應當關注上下/左右邊界能否相接。

  • 若上下及左右邊界均相接,則答案為 \(1\)

  • 若上下及左右邊界均不相接,則每個小塊都是一個聯通塊。設圖 \(G_1\) 中共 \(s\) 個黑格,則答案為 \(s^{k-1}\)

否則考慮左右相接而上下不相接的情況。設 \(G_1\) 左右邊界上有 \(p\) 個格子相接,那么 \(G_k\) 的左右邊界上有 \(p^k\) 個格子相接。

考慮迭代 \(k\) 次,相當於將 \(G_1\) 的每個黑格替換為 \(G_{k-1}\)。由於上下不相接,所以每一行是獨立的。

那么一行中連續的 \(t\) 個黑格全部替換為 \(G_{k-1}\) 后,得到的聯通塊數量即為 \(tf_{k-1}-p^{k-1}\)

設所有行的連續段長度之和為 \(A\),數量為 \(B\),則有遞推式:

\[f_0=1,f_k=Af_{k-1}-B p^{k-1} \]

當然可以直接寫矩陣快速冪求出。

懶得寫怎么辦呢? Bonus\(k \leq 10^{10^5}\)

寫成生成函數就是 \(F(x)=AxF(x)-\dfrac{Bx}{1-x}+1\),即 \(F(x)=\dfrac{1-(p+B)x}{(1-px)(1-Ax)}\)

部分分式化后解得:

\[f_k= \begin{cases} \dfrac{Bp^k+(A-p-B)A^k}{A-p},A \neq p\\ (k+1)A^k-k(A+B)A^{k-1},A=p \end{cases} \]

時間復雜度 \(O(\log k)\)

ARC142D Deterministic Placing (2900)

場上被 C 卡死了,這題要是時間充裕就搞出來了

首先注意到操作可逆,也即若在情況間連轉移邊,所有合法的情況一定形如若干二元環。

考慮合法情況 \(A\),將每個棋子向移動到的點連邊,顯然會連出若干條鏈。這些鏈必須覆蓋所有點,否則空點的鄰居就可以改為移向空點,不合法。

注意到 \(A\) 的所有鏈尾都沒有棋子,而其轉移到的狀態 \(B\) 的所有鏈頭都沒有棋子。而若某條鏈的鏈頭 \(u\) 與另一條鏈的非鏈頭 \(v\) 相鄰,\(v\) 就可以在 \(A,B\) 狀態之一中移向 \(u\),不合法。

容易發現在這兩個限制下一定是合法的。

於是一個情況合法的充要條件為:

  • 所有的鏈恰好覆蓋了樹上的所有點。

  • 每條鏈的鏈頭的鄰居都為某條鏈的鏈頭,每條鏈的鏈尾的鄰居都為某條鏈的鏈尾。

那么設計一個樹形依賴背包 DP 即可。設 \(f_{u,0/1/2}\) 分別表示 \(u\) 號點不是端點,當前連接了下面連上來的 \(0/1/2\) 條鏈的方案數。\(g_{u,0/1}\) 分別表示 \(u\) 號點是端點,當前連接了下面連上來的 \(0/1\) 條鏈的方案數(\(g_{u,1}\) 是實際方案數除二,這是為了在給 \(f\) 轉移只有一種選擇)。那么有轉移:

\[g_{u,1} \leftarrow g_{u,0}f_{v,1}+g_{u,1}f_{v,1} \]

\[g_{u,0} \leftarrow g_{u,0}g_{v,1} \]

\[f_{u,2} \leftarrow f_{u,2}f_{v,2}+2f_{u,1}f_{v,1} \]

\[f_{u,1} \leftarrow f_{u,0}f_{v,1}+f_{u,1}f_{v,2} \]

\[f_{u,0} \leftarrow f_{u,0}f_{v,2} \]

在 u 的轉移結束后,還要轉移 \(f_{u,1} \leftarrow f_{u,1}+g_{u,0}\)

時間復雜度 \(O(n)\)

AGC040D Balance Beam (3500)

容易發現若 Ringo 的起始點為 \(x\) 時 Snuke 能夠追上 Ringo,則起始點為 \(y(y<x)\) 時也能。故使 Snuke 獲勝的起始點一定是一段前綴。

下面設 \(a_t,b_t\) 分別表示點 \(t\) 所在的整段的 \(A\) 值與 \(B\) 值。

考慮起始點為 \(x\),Snuke 在 \(y\) 處追上 Ringo。則需要滿足:

\[-\int_0^x a_t dt+\int_x^y(b_t-a_t) dt \geq 0 \]

顯然 \(y\) 所在的整段 \(k\) 一定滿足 \(A_k<B_k\),故 \(\lceil y \rceil\) 也一定滿足條件,故不妨設 \(y\) 為整點。

假設 \(x\) 只能為整點(即求答案向下取整的值),那么問題相當於在所有整段中選出兩個不交的集合 \(S_1,S_2\) 滿足 \(s=-\sum_{i \in S_1} A_i+\sum_{i \in S_2} (B_i-A_i) \geq 0\),最大化 \(|S_1|\)。可以設計這樣一個算法:

  • 對於每個整段 \(k\),先將其放入 \(S_2\) 或者丟掉,再賦權值 \(c_k\) 表示將其改為放入 \(S_1\) 新增的代價(即讓 \(s\) 減少多少)。

    • \(A_k \leq B_k\),則先將 \(k\) 選入 \(S_2\) 中使 \(s\) 獲得 \(B_k-A_k\) 的值,\(c_k=B_k\)
    • \(A_k > B_k\),則先將其丟掉,\(c_k=A_k\)
  • 將所有 \(c_k\) 從小到大排序,若當前 \(s \geq c_k\) 則選入並令 \(s \leftarrow s-c_k\),否則報告答案退出。

對於原問題,枚舉選擇一個整段 \(k\) 作為 \(x\) 所在的整段。設 \(p=x-\lfloor x \rfloor=\{x\}\),那么其對 \(s\) 的貢獻為 \(-pA_k+(1-p)(B_k-A_k)\)

令初始 \(s=B_k-A_k\),對剩下的 \(n-1\) 個整段進行上述算法,即可計算通過得到 \(p\) 以及答案。對所有 \(k\) 的答案取 \(\max\) 即可。

預處理前綴和后可以二分優化算法的第二步,時間復雜度 \(O(n \log n)\)

注意分數比較時可能會爆 \(\text{long long}\)

ABC257Ex Dice Sum 2 (3500)

顯然答案只與每個骰子六個面的和 \(S_i\) 及平方和 \(Q_i\) 有關(考慮指數型生成函數)。

考慮計算買了某 \(k\) 個骰子的期望收益,拆括號算(也可以用概率型生成函數)。下面的變量 \(i,j\) 都是在這 \(k\) 個骰子中枚舉:

\[\begin{aligned} S&=\dfrac{1}{6^k} \Big( \sum\limits_{i,p} 6^{k-1} A_{i,p}^2 +2 \sum\limits_{i \neq j,p,q} 6^{k-2}A_{i,p}A_{j,q}\ \Big)-\sum\limits_i C_i\\ &=\dfrac{1}{6} \sum\limits_{i,p} 6^{k-1} A_{i,p}^2+\dfrac{1}{18} \cdot \dfrac{1}{2} \big[ (\sum\limits_{i,p} A_{i,p})^2-\sum\limits_{i}(\sum\limits_{p} A_{i,p})^2 \big]\\ &=\dfrac{1}{36} (\sum\limits_{i} S_i)^2+\dfrac{1}{6} \sum\limits_{i} Q_i-\dfrac{1}{36} \sum\limits_{i} S_i^2-\sum\limits_i C_i\\ \end{aligned} \]

\(B_i=6 \sum\limits_{i} Q_i-\sum\limits_{i} S_i^2-36 \sum\limits_i C_i\),則 \(S=\dfrac{1}{36} \Big[ (\sum\limits_{i} S_i)^2+\sum\limits_{i} B_i \Big]\)

顯然最難處理的就是這個平方項。考慮一個神奇的想法:將兩個 \((\sum\limits_{i} S_i)\) 中的一個換成變量 \(x\),這樣枚舉 \(x\) 就只需要處理關於 \(x\) 的一次函數即可。(正確性見下方證明)

於是 \(36S=\sum\limits_{i} (S_ix+B_i)\)。對於一個固定的 \(x\),將 \(n\) 個骰子按這個值排序后取最大的 \(k\) 個統計答案即可(注意是按 \(36S=(\sum\limits_{i} S_i)^2+\sum\limits_{i} B_i\) 統計,因為 \(x\) 不一定是 \(\sum S_i\))。

那么只需要維護函數值間的大小關系即可。考慮令 \(x\) 從小到大掃描,任意兩根直線間至多只有一個交點,這兩個函數值的大小關系也只會變化一次。求出所有交點后維護所有函數值的大小關系,統計答案即可。

具體實現,可以維護一個有向完全圖表示大小關系(\(u\) 連向 \(v\) 表示 \(u\) 大於 \(v\)),那么只需要統計入度 \(<k\) 的直線的函數值之和即可。注意交點的 \(x\) 坐標可能重復,意味着函數值可能相等。我們不在這種情況下統計答案(會算重),於是再對入度開一個桶判重即可。

時間復雜度 \(O(n^2+\text{sort}(n^2))\)


正確性證明(不保證正確):設最優解的 \(S,B\) 之和分別為 \(S_1,B_1\)。令 \(x=2S_1\),假設存在另一組解 \(S_2,B_2\) 滿足:

\[S_2x+B_2>S_1x+B_1,S_2^2+B_2<S_1^2+B_1 \]

\[2S_1^2-2S_1S_2<B_2-B_1<S_1^2-S_2^2 \]

\[(S_1-S_2)^2<0 \]

顯然矛盾。故一定會被枚舉到最優解之一。

AGC031D A Sequence of Permutations (3100)

\(f(p,q)=r\),則 \(r_{p_i}=q_i\)\(r_{i}=q_{p^{-1}_i}\),即 \(r=q \circ p^{-1}\)

寫出前幾項看看(下面省略復合符號):

\[a_1=p\\ a_2=q\\ a_3=q p^{-1}\\ a_4=q \underline{p^{-1}} q^{-1}\\ a_5=q p^{-1} \underline{q^{-1}} p q^{-1}\\ a_6=q p^{-1} \underline{q^{-1} p} p q^{-1}\\ a_7=q p^{-1} q^{-1} p \underline{p} p^{-1} q p q^{-1}\\ a_8=q p^{-1} q^{-1} p \underline{q} p^{-1} q p q^{-1}\\ a_9=q p^{-1} q^{-1} p \underline{q p^{-1}} p^{-1} q p q^{-1}\\ \cdots \]

規律十分顯然。設 \(V=q p^{-1} q^{-1} p\),下面歸納證明:

  • \(i \in [1,4]\)\(a_{6k+i}=V^t a_i V^{-t},a_{6k+i+1}=V^t a_{i+1} V^{-t} \Rightarrow a_{6k+i+2}=V^t a_{i+1} V^{-t} V^t a_i^{-1} V^{-t}=V^t a_{i+2} V^{-t}\)

  • \(a_{6k+5}=V^t a_5 V^{-t},a_{6k+6}=V^t a_6 V^{-t} \Rightarrow a_{6k+7}=V^t a_7 V^{-t}=V^{t+1} p V^{-t-1}\)

  • \(a_{6k+6}=V^t a_6 V^{-t},a_{6k+7}=V^t a_7 V^{-t} \Rightarrow a_{6k+8}=V^t a_8 V^{-t}=V^{t+1} q V^{-t-1}\)

於是只需要計算復合及 \(k\) 次復合即可。不需要快速冪,將置換拆成若干個循環,可以快速算出每個循環的答案。

時間復雜度 \(O(n)\)

所以為什么所有題解寫的都是快速冪,也沒多麻煩吧

ARC144D AND OR Equation (2500)

按每一位分別考慮。注意到對於第 \(t\) 位不為的二進制數 \(S\)\(f(S)+f(2^t)=f(S+2^t)+f(0)\),即 \(f(S+2^t)-f(S)=f(2^t)-f(0)\)

\(w_t=f(2^t)-f(0)\),可推知 \(f(S)=\sum\limits_{i \in S} w_i\),同時容易驗證該函數是合法的。

那么接下來只需要數 \(\{f(0),w_0,\cdots,w_{n-1}\}\) 即可,需要滿足 \(f(0) \in [0,k],f(0)+\sum\limits_{i=0}^{n-1} |w_i| \leq k\)

寫成生成函數即:

\[\begin{aligned} Ans &= \sum\limits_{i=0}^k [x^i]\dfrac{1}{1-x} (1+2x+2x^2+\cdots)^n\\ &=[x^k] \dfrac{1}{(1-x)^2} (\dfrac{2}{1-x}-1)^n\\ &=\sum\limits_{i=0}^n 2^i(-1)^{n-i} \dbinom{k+i+1}{k} \\ \end{aligned} \]

時間復雜度 \(O(n)\)

ABC260Ex Colorfulness (3300)

看錯題想了一晚上

\(k\) 次方之和看起來很不可做而且一看就是二合一,假裝沒有。下面對每個 \(k\) 計算 \(C(P)=k\) 的排列個數 \(s_k\)

設第 \(i\) 種顏色有 \(m_i\) 個球。

枚舉顏色的所有排列,相當於讓同種顏色的球不區分了。故對於一種顏色排列,其對應的原排列都有 \(\prod\limits_{i} m_i!\) 種。

那么只需要對每個 \(k\) 數恰有 \(k\) 個連續段的顏色排列數量即可。

這是個經典問題,設 \(g_k\) 表示欽定有 \(k\) 個相鄰位置顏色相同,通過二項式反演即可得到答案。

對每種顏色 \(i\),欽定有 \(c_i\) 個相鄰顏色相同。那么總方案數是:

\[\dbinom{n-\sum\limits_{c_i}}{m_1-c_1,\cdots,m_n-c_n} \prod\limits_{i=1}^{n} \dbinom{m_i-1}{c_i} \]

分治 NTT 卷一卷即可得到。該部分時間復雜度 \(O(n \log^2 n)\)

那對於二合一的后半部分,已經板到不能再板了,寫成生成函數的形式,再交換和號,算一算分式求和即可做到 \(O(n \log^2 n+m \log m)\)

總時間復雜度 \(O(n \log^2 n+m \log m)\)

AGC024F Sequence Growing Hard (3000)

為了避免邊界問題,在每個序列的末尾補一個 \(0\)

考慮怎樣的插入是合法的。設插入的數為 \(x\),其后面的數為 \(y\),則:

  • \(x<y\),則一定不合法。

  • \(x>y\),則一定合法。

  • \(x=y\),設 \(y\) 后第一個不與 \(y\) 相同的數為 \(k\)。若 \(y<k\) 則不合法,否則合法。

注意到第 \(3\) 種情況其實與在 \(k\) 前插入 \(x\) 是等價的,其恰能轉化為第一或第二種情況之一。故只考慮前兩種情況即可不重不漏。

那么現在問題變為每次在某個數 \(y\) 前插入 \(x(x>y)\)。於是若由 \(y\)\(x\) 連邊(數間連邊,非值間連邊),那么最后會形成一棵大小為 \(n+1\) 的有根樹。它滿足:

  • 根的權值為 \(0\),樹的每個非根節點的權值大於其父親權值。

  • 每個非葉節點的兒子有序。

那么只需要對樹計數即可。設 \(f_{i,j}\) 表示樹根的值為 \(i\),共有 \(j\) 個點的方案數;\(g_{i,j}\) 表示 \(f_{i,j}\) 關於 \(i\) 的后綴和。轉移時用 \(f_{i,t}\)\(g_{i+1,j-t}\) 拼在一起即可。

注意一棵樹不一定只對應一個合法序列,實際上數的是其特殊拓撲序的數量,拓撲序要滿足:

  • 每個點的拓撲序比其所有兒子拓撲序小。

  • 每個點靠右兒子的拓撲序比靠左兒子的拓撲序小。

計數時可以看做從右到左枚舉每個兒子 \(v\),先把 \(v\) 的子樹中除了 \(v\) 的加入並與先前的可重排,再加入 \(v\)。於是實際轉移式是:

\[f_{i,j} \leftarrow [j=1]+\sum\limits_{t=1}^{j-1} \dbinom{j-2}{t-1} f_{i,t} g_{i-1,j-t} \]

時間復雜度 \(O(kn^2)\)

\(h_{i,j}=f_{i,j+1}\),則:

\[h_{i,j} \leftarrow [j=0]+\sum\limits_{t=0}^{j-1} \dbinom{j-1}{t} h_{i,t} g_{i-1,j-t} \]

那么可以用分治 NTT 做到 \(O(kn \log^2 n)\)

(不保證正確)寫出來大概是一個類似 \(H'=HP+1\) 的東西,也許可以解微分方程做到 \(O(kn \log n)\)

AGC004E Salvage Robots (3200)

這么多機器人一起動很麻煩,看作是出口帶着牆壁一起動,牆壁撞到機器人就清除掉了。

考慮出口已經走過的地方。如果走過一步后走過的區域的橫縱坐標最小最大值沒有變,那么不會有機器人掛掉。

所以整個過程相當於維護一個矩形,每次向上下左右某個方向拓展一條邊,並將這條邊上還活着的機器人救下。

那么直接二維區間 DP 維護這個過程即可。時間復雜度 \(O(n^2 m^2)\)

ABC258Ex Odd Steps (2800) | AGC013E Placing Squares (3500)

2017 *3500=2022 *2800

寫一個不需要任何組合意義的暴力代數做法。

ABC258Ex Odd Steps

考慮只有 \(S\) 的限制的方案數。寫成生成函數即:

\[\begin{aligned} F(x)&=\dfrac{1}{1-\dfrac{x}{1-x^2}}\\ &=\dfrac{1-x^2}{1-x^2-x}\\ &=1+\dfrac{x}{1-x-x^2}\\ \end{aligned} \]

熟悉斐波那契數的同學都知道,這就是斐波那契數的生成函數。

熟悉斐波那契數的同學都知道,斐波那契數的通項公式是:

\[fib_n=\dfrac{1}{\sqrt 5}[(\dfrac{1+\sqrt 5}{2})^n-(\dfrac{1-\sqrt 5}{2})^n]=\dfrac{1}{\sqrt 5}(A^n-B^n) \]

對於限制,容斥欽定一個點集 \(S\) 必須經過。考慮設 \(f_i\) 表示考慮前 \(i\) 個點,欽定經過第 \(i\) 個點的方案數,有:

\[f_i=-\sum\limits_{j=0}^{i-1} fib_{a_i-a_j} f_j=\dfrac{1}{\sqrt 5} (A^{a_i} \sum\limits_{j=0}^{i-1} A^{-a_j} f_j-B^{a_i} \sum\limits_{j=0}^{i-1} B^{-a_j} f_j) \]

前綴和優化即可。時間復雜度 \(O(n \log S)\)

不過 \(5\) 在模 \(998244353\) 下沒有二次剩余,還需要拓域。


AGC013E Placing Squares

還是先考慮沒有限制的情況。

先寫出 \(F(x)=\sum_{i=0} i^2 x^i\) 的封閉形式。由 \(k^2=2\dbinom{k+2}{2}-3\dbinom{k+1}{1}+\dbinom{k}{0}\),可以得到:

\[F(x)=\dfrac{2}{(1-x)^3}-\dfrac{3}{(1-x)^2}+\dfrac{1}{1-x} \]

於是答案的生成函數為:

\[G(x)=\dfrac{1}{1-F(x)}=\dfrac{(1-x)^3}{-x^3+2x^2-4x+1} \]

化為線性遞推形式即:

\[g_0=0,g_1=1,g_2=5,g_k=4g_{k-1}-2g_{k-2}+g_{k-3} \]

記矩陣 \(M\) 的第三行第一列值為 \(v(M)\)

故可以寫成矩陣快速冪形式 \(g_k=v(A^kP)\)。同樣的:

\[f_i=v\big( -\sum\limits_{j=0}^{i-1} f_j A^{x_i-x_j} P \big)=v\big( A^{x_i} (\sum\limits_{j=0}^{i-1} f_j A^{-x_j}) P \big) \]

\(A\) 是有逆矩陣的,前綴和優化即可。時間復雜度 \(O(m \log n)\)

ARC120F/F2 Wine Thief (3100/???)

Easy Version

Sol1(官方題解):

這個是怎么想到的

顯然求出每個酒瓶被選中的次數 \(ans_i\) 即可。

記序列上的總方案數為 \(p_{n,k}=\dbinom{n-k+1}{k}\),環上總方案數為 \(q_{n,k}=p_{n-1,k}+p_{n-3,k-1}\)(枚舉第一個酒瓶是否選)。

注意到如果問題在環上,那么每個位置的方案數都是相等的。棘手的地方在於所有酒瓶排成一個序列而不是環。

考慮先計算環的方案數,再將不滿足環但滿足序列的方案補上。可以設計這樣一個算法:

  • 初始令 \(l=1,r=n\)。記 \(len=r-l+1\)
  • \(ans_l,ans_{l+1},\cdots,ans_r\) 都加上 \(\dfrac{len}{n} q_{len,k}\)。(環的方案數)
  • \(ans_l,ans_r\) 加上 \(f_{len-4,k-2}\)。(同時選了 \(l,r\),對 \(ans_l,ans_r\) 的貢獻)
  • \(l \leftarrow l+2,r \leftarrow r-2,k \leftarrow k-2\),重復進行。(同時選了 \(l,r\),對 \(ans_{l+2},\cdots,ans_{r-2}\) 的貢獻)

維護差分數組即可,時間復雜度 \(O(n)\)

注意當 \(l=r,k=1\)\(q_{1,1}=0\),但應該計入方案中,需要特判。

Sol2

這才是正確的做法

這里先假設 \(d\) 不一定等於 \(2\)。記序列上的總方案數為 \(p_{n,k}=\dbinom{n-(d-1)(k-1)}{k}\)

考慮 DP。設 \(f_{n,k,i}\) 表示在 \(n\) 個酒瓶中選 \(k\) 個,第 \(i\) 個被選中的次數。

\(i\) 個被選中,要求 \(i-d \sim i-1\)\(i+1 \sim i+d\) 均不能被選。但直接將兩邊刪去會造成額外的限制。

考慮只刪去 \(i \sim i+d\),再要求 \(i-d \sim i-1\) 不能選,這樣限制是正確的。又由於 \(i-d \sim i-1\) 中至多只能選一個,可以得到:

\[f_{n,k,i}=p_{n-d,k-1}-\sum\limits_{j=\max(1,i-d)}^{i-1} f_{n-d,k-1,j} \]

那么當 \(d=2\) 時,就是:

\[f_{n,k,i}=p_{n-2,k-1}-f_{n-2,k-1,i-1}=p_{n-2,k-1}-p_{n-3,k-2}+f_{n-3,k-2,i-2}=\cdots \]

對於每個 \(i\),前面的部分都是一樣的,而最后的 \(f_{n',k',1}=p_{n'-2,k'-1}\) 容易計算。

時間復雜度 \(O(n)\)

Hard Version

書接上文,有:

\[f_{n,k,i}=p_{n-d,k-1}-\sum\limits_{j=\max(1,i-d)}^{i-1} f_{n-d,k-1,j} \]

我們只關心 \(f_{n-dt,k-t}\) 處的值。寫出生成函數,記 \(F_t(x)=\sum\limits_{i=1}^{n-dt} f_{n-dt,k-t,i} x^i\)。那么轉移即:

\[F_t(x)=-F_{t+1}(x) \sum\limits_{i=1}^{d-1} x^i + p_{n-d(t+1),k-(t+1)} \sum\limits_{i=1}^{n-dt} x^i \]

\(m=\min(\lfloor \dfrac{n}{d} \rfloor,k-1)\),邊界條件即 \(F_m(x)=\sum\limits_{i=1}^{n-dm} x^i\)

\(V(x)=-\sum\limits_{i=1}^{d-1} x^i\)\(w_t=p_{n-d(t+1),k-(t+1)}\)\(P_t(x)=w_t \sum\limits_{i=1}^{n-dt} x^i\)。於是:

\[\begin{aligned} F_t(x)&=F_{t+1}(x)V(x)+P_t(x)\\ &=F_{t+2}(x)V^2(x)+P_{t+1}(x)V(x)+P_t(x)\\ &=\cdots\\ &=\sum\limits_{i=t}^m P_i(x) V(x)^{i-t} \end{aligned} \]

只需要計算:

\[F_0(x)=\sum\limits_{i=0}^m P_i(x) V(x)^{i} \]

這可以分治 NTT 解決。

當然這和普通的分治 NTT 不太一樣:

如圖。圓圈表示 \(V\),方框表示 \(P\)(內部是加號),右邊為低位。注意一行中每一塊是 \(d\) 次多項式。

先拋掉藍色范圍外的部分(最后加上即可)。記 \(P_{l,r}(x)\) 表示圓圈(不帶 \(w\))的乘積(即 \(V^{r-l+1}\)),\(Q_{l,r}(x)\) 表示 \(l \sim r\) 行每行圓圈乘積(帶 \(w\))之和,\(R_{l,r}(x)\) 表示范圍內的答案(欽定方框的最低位為 \(x^0\))。

\[P_{l,r}(x)=P_{l,mid}(x) P_{mid+1,r}(x) \]

\[Q_{l,r}(x)=P_{l,mid}(x) Q_{mid+1,r}(x)+Q_{l,mid}(x) \]

\[R_{l,r}(x)=P_{l,mid}(x) R_{mid+1,r}(x)+Q_{l,mid}(x) \sum\limits_{i=1}^{d(r-mid)} x^i+x^{r-mid} (R_{l,mid}(x)-w_{mid} P_{l,mid}(x)) \]

總時間復雜度 \(O(n \log n \log \dfrac{n}{d})\)

注意 \(k=1\) 時會導致 \(m=0\),特判即可。

這 n 是怎么敢出到 1e6 的,如果被卡常了可以考慮特判掉 \(d=2\)

AGC015E Mr.Aoki Incubator (3600)

又看錯題了,以為速度可以為負,又想了一晚上

下面稱變成 Aoki 的 Takahashi 為被標記的

結論:設若初始標記集合 \(S\),最終被標記的人集合為 \(f(S)\),那么 \(f(S \bigcup T)=f(S) \bigcup f(T)\)

證明:假設最終有一個人 \(x \notin f(S) \bigcup f(T)\),那么他不可能初始被標記,且標記他的人 \(x'\) 同樣滿足 \(x' \notin f(S) \bigcup f(T)\)……無限遞歸下去,而這個過程是有限的,故假設矛盾。

那么考慮只標記一個人 \(x\),最終被標記的是哪些。

首先在 \(x\) 右邊且比 \(x\) 慢的會被標記,在 \(x\) 左邊且比 \(x\) 快的會被標記。

但不僅如此。在 \(x\) 左邊且比 \(x\) 快的超過 \(x\) 后會將右邊比它們慢的標記,同樣在 \(x\) 右邊且比 \(x\) 慢的會將左邊比它們快的標記。容易發現新增的這些不會標記更多的人

將所有人按坐標排序,記速度的前綴最大值為 \(pmx_x\),后綴最小值為 \(smn_x\),那么被標記的人是:

  • \(x\) 本身。
  • \(x\) 左邊,且比 \(smn_x\) 嚴格快的人。
  • \(x\) 右邊,且比 \(pmx_x\) 嚴格慢的人。

\(dp_i\) 表示考慮前 \(i\) 個人,初始標記了第 \(i\) 個人的方案數。

假設由 \(j\) 轉移而來(上一個初始標記的是 \(j\)),那么覆蓋不到的區域是位置在 \((j,i)\) 的人且速度在 \([pmx_j,smn_i]\) 中的人。

由於 \(pmn,pmx\) 都是單調不降的,故對於一個 \(i\) 而言 \(j\) 具有可二分性。那么維護能轉移的最小的 \(j\),其具有單調性。

用 Two-pointer 維護即可,同時類似莫隊維護檢查的矩形。時間復雜度 \(O(\text{sort}(n))\)

AGC002F Leftmost Ball (3400)

考慮先枚舉 \(0\) 色點的位置。那么計算方案時從右往左,每遇到一個 \(0\) 色點就在前面的數中抽 \(k-1\) 個出來。

直接 DP 只能做到 \(O(n^2k)\),沒有前途。

換一個思路,不定順序,而是全局一種一種顏色地加。為了避免算重,還要定一個加入顏色的順序。

不妨將每種非 \(0\) 顏色的第一個位置拿出來並按位置排序,按照這個順序加入。這樣相當於每次加入新顏色都要求新加入的第一個位置前面都填 \(0\)

這樣貌似已經可以做了,不過一個更巧妙的處理是將 \(0\) 色點與其它顏色分開處理。即每次加入是以下兩種之一:

  • 將第一個未染色的位置變成 \(0\)
  • 將包含第一個位置的某 \(k-1\) 個位置染成一種新顏色(要求染完后非 \(0\) 顏色數不能超過 \(0\) 個數)。

那么設 \(f_{i,j}(i \geq j)\) 表示已加入 \(i\)\(0\)\(j\) 種非 \(0\) 顏色。轉移為:

\[f_{i,j} \leftarrow f_{i-1,j}+(n-j+1) \dbinom{nk-i-(j-1)(k-1)}{k-2} f_{i,j-1} \]

時間復雜度 \(O(n(n+k))\)

注意 \(k=1\) 時比較特殊,要特判。

ARC145F Modulo Sum of Increasing Sequences (3900)

反演好題,單位根反演在模數較大時還是有用的

\(p=MOD\)

考慮處理不降的限制,可以計數差分數組。設 \(a_{n+1}=m\),差分數組為 \(c_1,c_2,\cdots,c_{n+1}\)。那么限制即 \(c_1+c_2+\cdots+c_{n+1}=m\),而原數和 \(s=nc_1+(n-1)c_2+\cdots+c_n\)

寫成生成函數即求:

\[[x^m] \prod\limits_{i=0}^n \dfrac{1}{1-y^ix} \]

其中 \(y\) 這一維是模 \(p\) 的循環卷積。

但這個形式還套個求逆,稍難處理。

可以從另一方面作些轉化:令每個 \(a_i \leftarrow a_i+i-1\)(最后所有都需要減掉 \(i(i-1)/2\)),則將不降改為單增,相當於在 \(0,1,\cdots,n+m-1\) 中選出 \(n\) 個數的集合。下面令 \(m \leftarrow n+m\),那么即求:

\[[x^n] \prod\limits_{i=0}^{m-1} (1+y^ix) \]

由於 \(p\) 很小,我們可以分開整塊與零塊兩部分算。令 \(r=m \bmod p\)\(m'=m-r\)

枚舉零塊中選了 \(q\) 個數,整塊中選了 \(n'=n-q\) 個數,那么分別計算:

\[F(y)=[x^{n'}][\prod\limits_{i=0}^{p-1} (1+y^ix)]^{m'/p} \]

\[G(y)=[x^q][\prod\limits_{i=0}^{r-1} (1+y^ix)] \]


計算 \(F(y)\)。循環卷積相當於對每個 \(d\)\(s_d=\sum_t f_{tp+d}\),可以用單位根反演。

\(\omega\)\(p\) 次單位根,先對每個 \(d\) 求出 \(F(\omega ^d)\)

\(d=1\) 時,大家都知道

\[\prod\limits_{i=0}^{p-1} (1-\omega^ix)=1-x^p \]

這是因為左右都為 \(p\) 次多項式且最高項系數相同,且根集均為 \(1,\omega,\omega^2,\cdots,\omega^{p-1}\)。由因式定理即得左右多項式相同。

\(d \neq 1\) 時,記 \(g=\gcd(d,p)\),那么會有:

\[\prod\limits_{i=0}^{p-1} (1-\omega^{di} x)=[\prod\limits_{i=0}^{p/g-1} (1-\omega^{g i} x)]^g=(1-x^{p/g})^g \]

\[F(\omega^d)=(1-(-x)^{p/g})^{gm/p} \]

令人驚訝,這是一個整式。二項式展開后 \(x^{n'}\) 系數即為 \([(p/g) \mid n'] \dbinom{gm/p}{n'/(p/g)}\)

然后需要用單位根反演還原系數:

\[s_i=\sum\limits_{t=0}^{d-1} \omega^{-ti} F(\omega^t x) \]

當然 \(998244353\) 再強大也不可能有 \(500\) 次單位根。直接記錄下來每個單位根的系數,設 \(s_i=\sum\limits_{t=0}^{p-1} c_{i,t} \omega^t\)

但是系數 \(s_i\) 一定是整數。知道對於某個 \(d\)\(\sum\limits_{t=1}^{p/d-1} \omega^{td}=-1\),接下來需要做的就是化簡。

設數組 \(e_{i,t}\) 使得 \(c_{i,k}=\sum\limits_{t \mid k} e_{i,t}\),則 \(s_i=c_{i,0}-\sum\limits_{t=1}^{p-1} e_{i,t}\)

莫比烏斯反演得 \(e_{i,k}=\sum\limits_{t \mid k} \mu(k/t) c_{i,t}\),於是:

\[\sum\limits_{k=1}^{p-1} e_{i,k}=\sum\limits_{k=1}^{p-1} \sum\limits_{t \mid k} \mu(k/t) c_{i,t}=\sum\limits_{t=1}^{p-1} c_{i,t} \sum\limits_{t=1}^{\lfloor (p-1)/i \rfloor} \mu(t) \]

可以在 \(O(p^2)\) 內完成。

由於需要做 \(r\) 次,該部分總時間復雜度 \(O(p^3)\)


計算 \(G(y)\)

直接預處理二元多項式乘積即可,該部分時間復雜度 \(O(p^3)\)


總時間復雜度 \(O(n+m+p^3)\)

AGC020F Arcs on a Circle (???)

為什么沒人切啊

經典實數 DP。

不過這道題放的是線段而不是點,線段是跨整數的,故線段間小數部分的限制很復雜,不能直接記錄。

可以先 \(O(n!)\) 枚舉線段間小數部分的大小關系。

考慮斷環為鏈。有一個很聰明的做法:以最長線段的左端點斷開。這樣不會有線段同時跨過該線段的左右端點,那么兩邊就獨立了。

\(dp_{i,j,k,S}\) 表示當前考慮到 \([i,i+1)\),能覆蓋最遠的右端點在 \([j,j+1)\),能覆蓋最遠的右端點是 \(k\),已經放了集合 \(S\) 的線段。轉移分步枚舉添加的線段即可。

總時間復雜度 \(O(n!2^n n^2 C^2)\)

AGC021F Trinity (4100)

考慮 DP。從左到右依次加入每一列,設 \(f_{i,j}\) 表示考慮前 \(i\) 列,共有 \(j\) 行已經填了黑格(不考慮空行與其的相對位置)的方案數。

考慮轉移,在已經填了黑格的行再填對於 \(A\) 而言沒有意義。設第 \(i\) 列新增了 \(k\) 個填了黑格的行,則:

  • \(k=0\),則只能在之前的 \(j\) 行中填數,方案數即 \(1+j+j(j-1)/2\)

  • \(k>0\),分情況討論:

    • 若最大最小值均在這 \(k\) 行之中,那么直接處理前面的 \(j\) 行與新增的 \(k\) 行的相對順序即可。即在 \(j+k\) 行中選 \(k\) 行,那么方案數就是 \(\dbinom{j+k}{k}\)

    • 若最大值或最小值在 \(k\) 行之中,可以看作在 \(j+k\) 行中選 \(k+1\) 行,並認為這 \(k+1\) 行最上面的一行在前面的 \(j\) 行中,下面則是新增的 \(k\) 行。那么方案數是 \(\dbinom{j+k}{k+1}\)

    • 若最大最小值均不在這 \(k\) 行之中,同理方案數 \(\dbinom{j+k}{k+2}\)

    • 該部分總轉移系數是 \(\dbinom{j+k}{k}+2\dbinom{j+k}{k+1}+\dbinom{j+k}{k+2}=\dbinom{j+k+2}{k+2}\)

總轉移式是:

\[f_{i,j}=f_{i-1,j}(1+\dbinom{j+1}{2})+\sum\limits_{t=1}^j \dbinom{j+2}{t+2} f_{i-1,j-t} \]

答案為 \(\sum\limits_{j=0}^n \dbinom{n}{j} f_{m,j}\)

暴力實現復雜度 \(O(nm^2)\),使用 NTT 優化可以做到 \(O(nm \log m)\)

事實上還有更好的方法。將轉移寫成指數型生成函數,可以得到:

\[\dfrac{f_{i,j}}{j!}=\dfrac{f_{i-1,j}}{j!}+\dfrac{f_{i-1,j}}{j!} \cdot \dfrac{j(j+1)}{2}+(j+1)(j+2) \sum\limits_{t=1}^j \dfrac{1}{(t+2)!} \dfrac{f_{i-1,j-t}}{(j-t)!} \]

\[F_i(x)=F_{i-1}(x)+x F'_{i-1}(x)+\dfrac{1}{2} x^2 F''_{i-1}(x)+[(e^x-1-x-\dfrac{x^2}{2})F_{i-1}(x)]'' \]

經過一大堆無用的計算得到:

\[F_i(x)=e^x F_{i-1}(x)+(2e^x-x-2)F'_{i-1}(x)+(e^x-1-x)F''_{i-1}(x) \]

那么設 \(F_i(x)=\sum\limits_{j=0}^m \sum\limits_{k=0}^m g_{i,j,k} x^j e^{kx}\),可以 \(O(m^3)\) 轉移。

考慮如何計算答案,考慮 \(x^i e^{jx}=\sum\limits_t x^i \dfrac{(jx)^t}{t!}\) 對答案的貢獻:

\[\sum\limits_t j^t \dfrac{(i+t)!}{t!} \dbinom{n}{i+t}=\dfrac{n!}{(n-i)!} \sum\limits_t j^t \dbinom{n-i}{t}=(1+j)^{n-1} \dfrac{n!}{(n-i)!} \]

於是總復雜度 \(O(n+m^3)\),而且不需要 NTT。

ARC137F Overlaps (3300)

先將所有端點離散化為 \(2n\) 個點,只對線段間相對關系計數,最后除掉 \((2n)!/2^n\) 即可。記左右端點分別為左右括號。

\(f_i\) 表示第 \(i\) 個右括號前面的左括號數 \(-(i-1)\),有限制 \(1 \leq f_i \leq k,f_i \geq f_{i-1}-1,f_n=1\),方案數即 \(\prod f_i\)。問題變為對所有合法的 \(\{f_i\}\) 計算方案數之和。

考慮對第二個條件容斥,即欽定一些 \(f_i \leq f_{i-1}-2\),這樣的限制形成一些連續段。

設這樣的長度為 \(i\) 的連續段方案數為 \(f_i\),記 \(F(x)=\sum\limits_i (-1)^{i-1} f_i x^i\),那么有 \(\dfrac{1}{1-S(x)}=F(x)\)\(S(x)=1-\dfrac{1}{F(x)}\)。可以 \(O(n \log n)\) 求出。

\(f_i\) 可以用分治乘求出:記 \(F_{l,r,id1,id2}\) 表示值域在 \([l,r]\)\(l\) 是否選擇,\(r\) 是否選擇的生成函數,直接分治乘即可。時間復雜度 \(O(k \log^2 k)\)

注意 \(f_n=1\) 的限制導致最后一段需要特殊處理重新求一遍。

總時間復雜度 \(O(n \log n+k \log^2 k)\)

ARC118F Growth Rate (3600)

怎么會有人把銀牌題出到 NOIP 模擬賽啊

\(f_{q,i}\) 表示只考慮前 \(q\) 個數,\(A_q=x\) 的方案數,那么有:

\[F_q(x)=\dfrac{x}{1-x} F_{q-1}(a_qx) \]

\(F_0(x)=\dfrac{x}{1-x}\),那么求 \(\sum\limits_{i=0}^m g_i\),其中:

\[G(x)=x^{\prod_{i=1}^n a_i} \prod\limits_{i=1}^n \dfrac{1}{1-x^{\prod_{j=i}^n a_j}} \]

下面考慮求出 \(G(x)/x^{\prod_{i=1}^n a_i}\)

雖然 \(G(x)\) 的形式美觀,但 \(m\) 的值域過大無法直接求解,還是考慮回原來的形式(復合與前綴和)。

考慮倒推,假設現在要求 \(S(B,m,k)=\sum\limits_{i=0}^m i^k b_i\)

  • \(B(x)=A(wx)\),則 \(S(B,m,k)=w^k S(A,\lfloor \dfrac{m}{w} \rfloor,k)\)

  • \(B(x)=\dfrac{1}{1-x} A(x)\),則(\(B_t\) 為伯努利數):

\[\begin{aligned} S(B,m,k) &=\sum\limits_{i=0}^m i^k b_i\\ &=\sum\limits_{i=0}^m i^k \sum\limits_{j=0}^i a_j\\ &=\sum\limits_{j=0}^m a_j \sum\limits_{i=j}^m i^k\\ &=(\sum\limits_{i=j}^m i^k) \sum\limits_{j=0}^m a_j-\sum\limits_{j=0}^m a_j \sum\limits_{i=0}^{j-1} i^k\\ &=(\sum\limits_{i=j}^m i^k) \sum\limits_{j=0}^m a_j-\sum\limits_{j=0}^m a_j \dfrac{1}{k+1} \sum\limits_{t=0}^k \dbinom{k+1}{t} B_t j^{k+1-t}\\ &=(\sum\limits_{i=j}^m i^k) \sum\limits_{j=0}^m a_j-\sum\limits_{t=0}^k \dfrac{1}{k+1} \dbinom{k+1}{t} B_t \sum\limits_{j=0}^m a_j j^{k+1-t}\\ &=(\sum\limits_{i=j}^m i^k) \sum\limits_{j=0}^m a_j-\sum\limits_{t=0}^k \dfrac{1}{k+1} \dbinom{k+1}{t} B_t S(A,m,k+1-t)\\ \end{aligned} \]

上式的前后部分均可卷積優化至 \(O(k \log k)\)

注意到每進行一次第二類操作,最大的 \(k\) 就無法維護。故只用維護 \(k=0,1,\cdots,n\) 即可。

總時間復雜度 \(O(n^2 \log n)\)

*標解有可能更優的 \(O(n \log^2 n \log m+n^2)\) 做法。

ABC272Ex Flipping Coins 2 (3700)

ABCEx 科技題

容易發現每個位置的硬幣的情況都是一樣的,下面考慮計算第 \(0\) 個硬幣未被翻動的概率。這等價於下面這個問題:

\([0,n)\) 的排列 \(p_1,p_2,\cdots,p_n\) 的個數,使得恰有偶數個 \(i\) 滿足 \(p_i \leq a_i\)

事實上偶數這個目標根本沒用,下面考慮對每個 \(k \in [0,n]\) 求出恰有 \(k\)\(i\) 滿足 \(p_i \leq a_i\) 的排列數量。

即求 \(Ferrers\) 棋盤 \(S=F(a_1+1,a_2+1,\cdots,a_n+1)\) 的所有 \(k-\)命中數 \(h_k\)。記 \(k-\) 棋盤數為 \(r_k\),有:

\[r_k(n-k)!=\sum\limits_{i=k}^n h_i \dbinom{i}{k} \]

\[h_k=\sum\limits_{i=k}^n (-1)^{k-i} \dbinom{i}{k} r_i (n-i)! \]

而由下降冪棋盤多項式分解定理,有:

\[\sum\limits_{i=0}^n r_{n-i} x^{\underline{i}}=\prod\limits_{i=1}^n (x+a_i-i+1) \]

采用分治下降冪卷積可以算出 \(r_i\),再二項式反演即可得到 \(h_i\)

總時間復雜度 \(O(n \log^2 n)\)

參考資料: 《2020 年集訓隊論文 淺談棋盤模型在計數問題中的應用》- 彭思進

AGC009E Eternal Average (3400)

設操作次數為 \(d=\frac{n+m-1}{k-1}\)

把初始的 \(n+m\) 個數視為 \(n+m\) 個點,每次操作 \(k\) 個數就新建一個點作為這 \(k\) 個數對應的點的父親。這樣可以將操作對應為一棵 \(n+m+d\) 個節點的 \(k\) 叉樹。

設每個點的權值為其兒子權值的平均值,則最后留下的數 \(s\) 即根節點的權值。

也即,設初始的 \(m\)\(1\) 所對應的編號為 \(x_1,x_2,\cdots,x_m\),則 \(s=\sum_{i=1}^m k^{-dep_{x_i}}\)

注意到,設初始的 \(n\)\(0\) 所對應的編號為 \(y_1,y_2,\cdots,y_n\),則有:

\[\sum\limits_{i=1}^m k^{-dep_{x_i}}+\sum\limits_{i=1}^n k^{-dep_{y_i}}=1 \]

考慮如何判定一個 \(s\) 是否可被構造出來:

結論:\(s\) 可被構造出來當且僅當存在 \(x_1,x_2,\cdots,x_m\) 滿足 \(\sum_{i=1}^m k^{-dep_{x_i}}=s\) 且存在 \(y_1,y_2,\cdots,y_n\) 滿足 \(\sum_{i=1}^n k^{-dep_{y_i}}=1-s\)

證明:必要性顯然。充分性:設 \(z_t\) 表示為 \(t\)\(x_i,y_i\) 個數,只需證可以構造一棵樹使得深度為 \(i\) 的葉子節點恰有 \(z_i\) 個。考慮這樣一個算法:

  • \(d\)\(1\) 枚舉 \(p\),由於 \(\sum_{t=1}^p z_t k^{-t}=1\),故 \(k \mid z_p\)。那么對這 \(z_p\) 個點建立 \(\frac{z_p}{k}\) 個父親節點,\(z_{p-1} \leftarrow z_{p-1}+\frac{z_p}{k},z_p \leftarrow 0\)

即可得到一棵滿足條件的樹。證畢。

下面考慮計數。考慮將 \(s,1-s\) 看作 \(k\) 進制小數,設 \(s=\sum_{i=1}^d a_i k^{-i},1-s=\sum_{i=1}^d b_i k^{-i}\),其中 \(a_i,b_i \in [0,k)\)。那么需要滿足:

  • \(\sum_{i=1}^d a_i=m-t_1 (k-1),t_1 \in \N\)

  • \(\sum_{i=1}^d b_i=n-t_2 (k-1),t_2 \in \N\)

這是因為每一次進位都會使數位和減少 \((k-1)\)

,則 \(\{b_i\}\) 即令所有 \(a_i \leftarrow k-1-a_i\),再令 \(a_d \leftarrow a_d+1\) 后進位獲得的結果,設進位次數為 \(t_3\),則:

\[\sum_{i=1}^d b_i=d (k-1)+1-\sum_{i=1}^d a_i-t_3 (k-1) \]

\[n-t_2 (k-1)=(n+m)-m+t_1 (k-1)-t_3 (k-1) \]

\[t_2 (k-1)=(t_3-t_1) (k-1) \]

\[t_2 \geq 0 \Leftrightarrow t_3 \geq t_1 \]

故枚舉 \(t_1 \leq t_3\),統計答案。

\(A\)\([0,k)\) 中的整數組成的和為 \(B\) 的數列數量為 \(S(A,B)\),可以用容斥計算:

\[S(A,B)=\sum\limits_{i=0}^A (-1)^i \dbinom{A}{i} \dbinom{B-ik+A-1}{A-1} \]

答案為:

\[Ans=\sum\limits_{t_3=0}^{d-1} \sum\limits_{t_1=0}^{t_3} [S(d-t_3,m-t_1(k-1))-S(d-t_3-1,m-t_1(k-1))] \]

直接暴力計算時間復雜度 \(O(d^2\frac{m}{k})=O(\frac{m(n+m)^2}{k^3})\),無法通過。

注意到 \(A\) 不超過 \(d-1\)\(B\) 不超過 \(m\)。枚舉最后一個數是什么,用下式遞推:

\[S(A,B)=\sum\limits_{i=0}^{k-1} S(A-1,B-i) \]

於是時間復雜度 \(O(d\frac{m}{k}+dmk)=O(m(n+m))\),可以通過。

(可能還有更優的做法?)

ABC279Ex Sum of Prod of Min (3300)

第一次用到五邊形數定理

限制條件很多,但觀察不出什么性質,不如直接硬上。

對第 \(t\) 個位置上填的數設出生成函數:

\[\begin{aligned} F_t(x) &=\sum\limits_{i \geq 0} \min(t,i) x^i\\ &=t(\dfrac{x}{1-x}-\dfrac{x-x^{t+1}}{1-x})+x \dfrac{d}{dx} (\dfrac{x-x^{t+1}}{1-x})\\ &=\dfrac{tx^{t+1}}{1-x}+x \dfrac{1-(t+1)x^t+tx^{t+1}}{(1-x)^2}\\ &=\dfrac{x-x^{t+1}}{(1-x)^2}\\ \end{aligned} \]

於是答案為:

\[\begin{aligned} Ans &=[x^m] \prod\limits_{t=1}^n \dfrac{x-x^{t+1}}{(1-x)^2}\\ &=[x^m] \dfrac{x^n}{(1-x)^{2n}} \prod\limits_{t=1}^n (1-x^t)\\ &=[x^{m-n}] (1-x)^{-2n} \prod\limits_{t=1}^n (1-x^t)\\ \end{aligned} \]

由於 \(m-n \leq n\),故:

\[\prod\limits_{t=1}^n (1-x^t) \equiv \prod\limits_{t \geq 1} (1-x^t) \pmod{x^{m-n+1}} \]

由五邊形數定理:

\[\begin{aligned} Ans &=[x^{m-n}] \sum\limits_{i \geq 0} \dbinom{2n-1+i}{2n-1} \sum\limits_{k \geq 0} (-1)^k x^{k(3k \pm 1)/2}\\ &=\sum\limits_{k \geq 0} (-1)^k \dbinom{2n-1+m-n-(k(3k \pm 1)/2)}{2n-1}\\ \end{aligned} \]

模數較小,用盧卡斯定理計算組合數。注意到枚舉的項數只有 \(O(\sqrt n)\) 項,時間復雜度 \(O(\bmod+\sqrt n \log_{\bmod} n)\)

AGC035E Develop (3700)

給每個數建一個點,數 \(x\)\(x-2\)\(x+K\) 連邊。那么最后擦去的集合能為 \(S\) 當且僅當 \(S\) 的導出子圖是 DAG。

\(K\) 為偶數時,奇偶數獨立,且 \(S\) 合法當且僅當不包含沒有奇/偶數中連續的 \(K/2+1\) 個數。那么設 \(dp_i\) 表示考慮前 \(i\) 個數且第 \(i\) 個數不選的方案數,有:

\[dp_i=\sum\limits_{j=i-K/2-1}^{i-1} dp_j \]

可以優化到 \(O(n)\)

\(K\) 為奇數時,情況較為復雜。考慮將奇數與偶數列成兩列,並令數 \(x\) 向數 \((x+k)\) 連邊。為方便,記奇數連向偶數的邊為 \(A\) 型邊,偶數連向奇數的邊為 \(B\) 型邊。

(圖來自博客 AGC035E Develop - 淸梣ling

結論:若 \(S\) 的導出子圖有環,則必存在一個環僅包含兩條連接兩側的邊。

證明:取環中最靠下的一條 \(A\) 型邊 \((u,v)\)。設 \(u\) 向下延申到 \(x\)\(v\) 向上延伸到 \(y\)\(x,y\) 分別與 \(x',y'\) 通過 \(B\) 型邊連接。

  • \(y \leq x'\),則 \((x,u,v,,x')\) 已經成環。

  • \(y > x'\),則如圖所示。設 \(y\) 向上延申到 \(z\)。由前提假設,\(z \leq u\),那么 \((y',u,v,y)\) 已經成環。

故證畢。

而所有這樣的環長均為 \(K+2\),於是 \(S\) 的導出子圖無環當且僅當不存在一條從左側延伸到右側的長為 \(K+2\) 的鏈。

接下來考慮計數。設 \(dp_{i,j,k}\) 表示從上到下考慮前 \(i\) 層節點,從第 \(i\) 層右側點延申的鏈長為 \(j\),從第 \(i\) 層左側點延伸到右側的鏈長為 \(k\)。轉移:

  • 兩側都不選:兩邊的鏈都斷掉。

\[f_{i-1,j,k} \rightarrow f_{i,0,0} \]

  • 選左側,不選右側:右側的鏈斷掉,左側(若有鏈)鏈長加一。

\[f_{i-1,j,k} \rightarrow f_{i,0,k+1}(k>0) \]

\[f_{i-1,j,0} \rightarrow f_{i,0,0} \]

  • 選右側,不選左側:右側的鏈長加一,左側的鏈斷掉。

\[f_{i-1,j,k} \rightarrow f_{i,j+1,0} \]

  • 兩側都選:右側的鏈長加一,左側的鏈在兩種方案中取較大值。

\[f_{i-1,j,k} \rightarrow f_{i,j+1,\max(k+1,j+2)} \]

總時間復雜度 \(O(n^2k)\)

ARC154F Dice Game (3600)

為什么省選前要做這個

提供一種不使用生成函數的暴力做法。

考慮扔 \(i\) 次已經扔出所有面的概率為 \(n! \dfrac{S2(i,n)}{n^i}\),於是期望時間的 \(k\) 次方為:

\[s_k =n!\sum\limits_{i \geq 0} (\dfrac{S2(i,n)}{n^i}-\dfrac{S2(i-1,n)}{n^{i-1}}) i^k \]

為了方便計算,取一個趨近於無窮大的整數 \(m\),只計算和式中 \(i \leq m\) 的部分。

下面用 \(\epsilon(m)\) 表示當 \(m\) 趨近於無窮大時值趨近於 \(0\) 的部分(於是在最終答案的計算中可以忽略)。結論:對於非負整數 \(k\) 與實數 \(a \in (0,1)\)\(\lim\limits_{x \rightarrow \infty} x^k a^x=0\)

\[\begin{aligned} s_k(m) &=n!\sum\limits_{i=0}^m (\dfrac{S2(i,n)}{n^i}-\dfrac{S2(i-1,n)}{n^{i-1}}) i^k\\ &=n! m^k \dfrac{S2(m,n)}{n^m}-n! \sum\limits_{i=0}^{m-1} \dfrac{S2(i,n)}{n^{i}} [(i+1)^k-i^k]\\ \end{aligned} \]

\(k-1\) 次下降冪多項式 \(\sum\limits_{p=0}^{k-1} c_p x^{\underline{p}}=(x+1)^k-x^k\)。系數 \(c_p\) 稍后再進行推導,下面繼續計算上式:

\[\begin{aligned} s_k(m) &=n! m^k \dfrac{S2(m,n)}{n^m}-n! \sum\limits_{p=0}^{k-1} c_p \sum\limits_{i=0}^{m-1} \dfrac{S2(i,n)}{n^{i}} i^{\underline{p}}\\ &=\dfrac{m^k}{n^m} \sum\limits_{t=0}^n (-1)^t \dbinom{n}{t} (n-t)^m -\sum\limits_{p=0}^{k-1} c_p \sum\limits_{i=0}^{m-1} i^{\underline{p}} \sum\limits_{t=0}^n (-1)^t \dbinom{n}{t} \dfrac{(n-t)^i}{n^{i}}\\ &=m^k \sum\limits_{t=0}^n (-1)^t \dbinom{n}{t} (\dfrac{n-t}{n})^m -\sum\limits_{p=0}^{k-1} c_p \sum\limits_{t=0}^n (-1)^t \dbinom{n}{t} \sum\limits_{i=0}^{m-1} (\dfrac{n-t}{n})^i i^{\underline{p}}\\ \end{aligned} \]

第一個和式中,當 \(t \neq 0\) 時均趨近於 \(0\),故其等於 \(m^k+\epsilon(m)\)

第二個和式中,考慮求 \(\sum\limits_{i=0}^{m-1} (\dfrac{n-t}{n})^i i^{\underline{p}}\)

  • \(t=0\) 時,其等於 \(\sum\limits_{i=0}^{m-1} i^{\underline{p}}=\dfrac{1}{p+1} m^{\underline{p+1}}\)

  • \(t \neq 0\) 時,記 \(a=\dfrac{n-t}{n}\)\(f(x)=\sum\limits_{i=0}^{m-1} a^i x^i=\dfrac{1-(ax)^m}{1-ax}\),所求即:

\[f^{(p)}(1)=p!\dfrac{a^p}{(1-ax)^{p+1}}+\epsilon(m)=p! \dfrac{n}{t} (\dfrac{n-t}{t})^p+\epsilon(m) \]

於是帶入得:

\[s_k(m) =m^k+\epsilon(m) -\sum\limits_{p=0}^{k-1} c_p \dfrac{1}{p+1} m^{\underline{p+1}} - \sum\limits_{p=0}^{k-1} c_p \sum\limits_{t=1}^n (-1)^t \dbinom{n}{t} [p! \dfrac{n}{t} (\dfrac{n-t}{t})^p+\epsilon(m)] \]

接下來先推導 \(c_t\)

\[\begin{aligned} \sum\limits_{p=0}^{k-1} \dbinom{k}{p} x^p &= \sum\limits_{p=0}^{k-1} \dbinom{k}{p} \sum\limits_{t=0}^p S2(p,t) x^{\underline{t}}\\ &= \sum\limits_{t=0}^{k-1} x^{\underline{t}} \sum\limits_{p=t}^{k-1} \dbinom{k}{p} S2(p,t) \\ \end{aligned} \]

\[\begin{aligned} c_p &=\sum\limits_{t=p}^{k-1} \dbinom{k}{t} S2(t,p)\\ &=\sum\limits_{t=p}^{k} \dbinom{k}{t} S2(t,p) -S2(k,t)\\ &=S2(k+1,t+1)-S2(k,t)\\ &=(t+1) S2(k,t+1)\\ \end{aligned} \]

\[s_k(m) =m^k+\epsilon(m) -\sum\limits_{p=0}^{k-1} S2(k,p+1) m^{\underline{p+1}} - \sum\limits_{p=0}^{k-1} (p+1) S2(k,p+1) \sum\limits_{t=1}^n (-1)^t \dbinom{n}{t} [p! \dfrac{n}{t} (\dfrac{n-t}{t})^p+\epsilon(m)] \]

可以發現關於 \(m\) 的部分全部消掉了。

\[s_k=- \sum\limits_{p=0}^{k-1} (p+1)! S2(k,p+1) \sum\limits_{t=1}^n (-1)^t \dbinom{n}{t} \dfrac{n}{t} (\dfrac{n-t}{t})^p \]

\[s_k=\sum\limits_{p=1}^{k} p! S2(k,p) \sum\limits_{t=1}^n (-1)^{t+1} \dbinom{n}{t} \dfrac{n}{t} (\dfrac{n-t}{t})^{p-1} \]

可以分兩步計算:

  • \[f_p=\sum\limits_{t=1}^n (-1)^{t+1} \dbinom{n}{t} \dfrac{n}{t} (\dfrac{n-t}{t})^{p-1} \]

  • \[s_k=\sum\limits_{p=1}^{k} p! S2(k,p) f_p \]

第一步即計算數列 \(k\) 次冪和,使用分治乘做到 \(O(n \log^2 n+m \log m)\)。具體做法可見 P4705 玩游戲.

第二步,將第二類斯特林數拆開:

\[\begin{aligned} s_k &= \sum\limits_{p=1}^{k} f_p \sum\limits_{t=0}^p (-1)^t \dbinom{p}{t} (p-t)^k\\ &= \sum\limits_{p=1}^{k} f_p \sum\limits_{t=0}^p (-1)^{p-t} \dbinom{p}{t} t^k\\ &= \sum\limits_{p=1}^{m} (-1)^p f_p \sum\limits_{t=0}^m (-1)^t \dbinom{p}{t} t^k\\ &= \sum\limits_{t=0}^m (-1)^t t^k \sum\limits_{p=1}^{m} (-1)^p \dbinom{p}{t} f_p \\ \end{aligned} \]

同樣分兩步計算:

  • \[g_t=\sum\limits_{p=1}^{m} (-1)^p \dbinom{p}{t} f_p \]

  • \[s_k=\sum\limits_{t=0}^m (-1)^t t^k g_t \]

第一步可以直接 NTT 計算,復雜度 \(O(m \log m)\)

第二步同樣是計算數列 \(k\) 次冪和,復雜度 \(O(m \log^2 m)\)

綜上,總時間復雜度 \(O(n \log^2 n+m \log^2 m)\)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM