題解:P10380 「ALFR Round 1」D 小山的元力

jxy2012發表於2024-06-27

分析題意,首先對於第 \(i\) 堆,當這堆放這 \(k\) 個元素的時候,無論這是哪一堆,它外面的情況的總數都是一樣的,也就是分配剩下 \(n-k\) 個數的情況的數量是一樣的。每一堆都如此,那麼這堆放 \(k\) 個元素的總貢獻就是 \(k\times\) 總情況數 \(\times sum\)\(sum=1!+2!+\cdots+m!\) 因為 \(sum\) 是固定的所以可以提出來最後相乘,那麼目就是求所有的 \(k\times\) 總情況數。

設一共有 \(n\) 個相同元素,放 \(m\) 堆(每堆可以不放),\(k\in[0,n]\),那麼剩下的就是求每個 \(k\) 對應的總情況數設當前堆放 \(k\) 個數,那麼就剩下 \(n-k\) 個數要分配到 \(m-1\) 個空堆(可以不放)。這裡可以用隔板法,用 \(m-2\) 個隔板,把剩下 \(n-k\) 個數分成 \(m-1\) 塊。因為有空堆,而隔板法不能有空的分配,所以可以人為加 \(m-1\) 個元素,把情況變成必須放,這時候元素有 \(n-k+m-1\) 個,空隙(兩邊不算)有 \(n-k+m-1-1\) 個,即 \(n-k+m-2\) 個。剩下的就是在這 \(n-k-2\) 個空隙裡面選 \(m-2\) 板,也就是求 \(C_{n-k+m-2}^{m-2}\)

求組合數有很多方法,當時看資料範圍,我直接用的快速冪求透過階乘求解,然後因為 \(p\) 的大小寄掉了,也是上面的提醒。因此這裡用 Lucas 定理求解組合數,這樣就不會因為 \(p\) 的事情寄掉了,時間上也夠。且因為數 \(p\) 不變,所以可以先預處理階乘,但是不要先預處理逆元,否則時間複雜度會變成 \(O(p\log n)\) 容易 TLE 態求解逆元,求出組合數,也就是總情況數。

最後把每種 \(k\) 的總情況數乘上 \(k\) 相加即

\[\sum_{k=0}^n(k\times C_{n-k+m-2}^{m-2}) \]

而這就是答案 \(ans\)

最後輸出 \((ans\times\boldsymbol{sum}) \bmod p\) 即可。注意當 \(m=1\) 的時候需要特判。

相關文章