1. 程式人生 > 實用技巧 >Solution Set -「ARC 107」

Solution Set -「ARC 107」

「ARC 107A」Simple Math

  Link.

  答案為:

\[\frac{a(a+1)\cdot b(b+1)\cdot c(c+1)}{8} \]

「ARC 107B」Quadruple

  Link.

  列舉 \(i=c+d\),則 \(a+b=i+k\),乘法原理計數。

「ARC 107C」Shuffle Permutation

  Link.

  由於矩陣內無相等元素,所以行和列的順序可以直接乘法原理。以對行的排列方案計數為例,並查集維護所有可以交換位置的行,則行的方案為每個集合大小的階乘之積。列同理。

「ARC 107D」Number of Multisets

  Link.

  我真的傻了啊這題都想不出來。

  DP,令 \(f(i,j)\) 表示 \(n=i,k=j\) 時的答案。利用當 \(i<j\)\(f(i,j)=0\) 的邊界,有轉移:

\[f(i,j)=f(i,2j)+f(i-1,j-1) \]

  自行理解。複雜度 \(\mathcal O(nk)\)

「ARC 107E」Mex Mat

  Link.

  結論:\((\forall i,j>4)(a_{ij}=a_{i-1,j-1})\)。手玩一下可以證明。(

  寫的時候可以用 std::vector,這樣直接在同一個“陣列”上二維下標引用會舒服一點。

  複雜度 \(\mathcal O(n)\)

「ARC 107F」Sum of Abs

  Link.

  首先考慮把絕對值轉化一下,對於一個集合 \(\{a\}\),顯然有:

\[|\sum a|=\max\{\sum a,\sum-a\} \]

  也就是說,一個聯通塊內的數可以同時取負。

  從資料範圍 \(n,m\le300\) 又想到最小割。不妨先獲得所有 \(|b_i|\) 的收益,然後建圖描述刪點的操作。

  一種建圖如下(\(b_1\ge 0,b_2<0\),圖中 \(i\) 應為 \(2\),抱歉 qwq):

  \(i+\) 表示這個點在聯通塊中作正貢獻,\(i-\) 則相反。割去 \(\langle i+,i-\rangle\)

表示刪去點 \(i\)。可以發現,在沒有刪點的情況下,兩個有邊相連的點不可能取一正一負,符合要求。