[AtCoder Regular Contest 124E] Pass to Next(dp+数学)
ARC 124 E Pass to Next
- problem
- solution
- code
problem
題目鏈接
solution
令 ci:c_i:ci?: 第 iii 個人傳給下一個人球的個數
當 min?{ci}≠0\min\{c_i\}\neq 0min{ci?}?=0 時,將每一個 cic_ici? 都減小 111,顯然答案序列并不會改變
所以,我們只需要考慮 min?{ci}=0\min\{c_i\}=0min{ci?}=0 的情況
這樣性質的 ccc 序列一共有 ∏i=1n(ai+1)?∏i=1nai\prod_{i=1}^n(a_i+1)-\prod_{i=1}^na_i∏i=1n?(ai?+1)?∏i=1n?ai? 種,每一種都會導致最后不同的結果序列
至少有一個人是不傳球的方案數:總方案數?-?每個人都傳球的方案數(將 +1+1+1 看作不傳球)
∏i=1nxi=∏i=1n(xi1):\prod_{i=1}^nx_i=\prod_{i=1}^n\binom{x_i}{1}:∏i=1n?xi?=∏i=1n?(1xi??): 理解成每個人傳完球后,從手里剩下的球中選一個的方案數
所以,我們就可以設計 dpi,0/1dp_{i,0/1}dpi,0/1? 轉移了
- dpi,0:dp_{i,0}:dpi,0?: 第 iii 個人從自己原有的球上選一個,前 i?1i-1i?1 個人的方案數
- dpi,1:dp_{i,1}:dpi,1?: 第 iii 個人從第 i?1i-1i?1 個人給的球中選一個,前 iii 個人的方案數
因為是同時一起給下一個人球的,所以每個人手中原本的球可以看成時一種來源,不同來源球直接的分配是相互獨立的,前一個人傳遞過來多少與自己傳遞多少出去是互不干擾的
-
dpi+1,0←dpi,0?ai(ai+1)2dp_{i+1,0}\leftarrow dp_{i,0}·\frac{a_i(a_i+1)}{2}dpi+1,0?←dpi,0??2ai?(ai?+1)?
由于 dpi,0dp_{i,0}dpi,0? 沒有算 iii 的貢獻,轉移時要加上;且這種情況 iii 時從自己手上剩的球中選一個
如果剩下 xxx 個就有 xxx 種選法,而 x∈[1,ai]x\in[1,a_i]x∈[1,ai?],所以方案數為 ∑x=1aix\sum_{x=1}^{a_i}x∑x=1ai??x
-
dpi+1,0←dpi,1?(ai+1)dp_{i+1,0}\leftarrow dp_{i,1}·(a_i+1)dpi+1,0?←dpi,1??(ai?+1)
由于 dpi,1dp_{i,1}dpi,1? 已經算了 iii 的貢獻,轉移只需要考慮 i→i+1i\rightarrow i+1i→i+1 的球數,且此情況下先不計算 i+1i+1i+1 在自己手上選球的貢獻
傳遞 0,1,...,ai0,1,...,a_i0,1,...,ai? 個一共是 ai+1a_i+1ai?+1 種方案
-
dpi+1,1←dpi,0?(ai?ai(ai+1)2?ai(ai+1)(2ai+1)6)dp_{i+1,1}\leftarrow dp_{i,0}·\Big(a_i·\frac{a_i(a_i+1)}{2}-\frac{a_i(a_i+1)(2a_i+1)}{6}\Big)dpi+1,1?←dpi,0??(ai??2ai?(ai?+1)??6ai?(ai?+1)(2ai?+1)?)
由于 i,i+1i,i+1i,i+1 的貢獻都沒有計算,轉移時要一起加上
如果 iii 傳遞了 xxx 個,那么就還剩下 ai?xa_i-xai??x 個,iii 是從自己手中選,則有 ai?xa_i-xai??x 中選法,i+1i+1i+1 是從 iii 傳的球中選一個,則有 xxx 種選法
所以總方案數為 ∑x=1aix(ai?x)=ai?∑x=1ai?∑x=1aix2=ai?ai(ai+1)2?ai(ai+1)(2ai+1)6\sum_{x=1}^{a_i}x(a_i-x)=a_i·\sum_{x=1}^{a_i}-\sum_{x=1}^{a_i}x^2=a_i·\frac{a_i(a_i+1)}{2}-\frac{a_i(a_i+1)(2a_i+1)}{6}∑x=1ai??x(ai??x)=ai??∑x=1ai???∑x=1ai??x2=ai??2ai?(ai?+1)??6ai?(ai?+1)(2ai?+1)?
-
dpi+1,1←dpi,1?ai(ai+1)2dp_{i+1,1}\leftarrow dp_{i,1}·\frac{a_i(a_i+1)}{2}dpi+1,1?←dpi,1??2ai?(ai?+1)?
由于已經計算了 iii 的貢獻,所以只需要考慮 i+1i+1i+1 的貢獻
i+1i+1i+1 選的是 iii 傳遞的球,如果 iii 傳了 xxx 個,那么就有 xxx 種選擇,方案數為 ∑x=1aix=ai(ai+1)2\sum_{x=1}^{a_i}x=\frac{a_i(a_i+1)}{2}∑x=1ai??x=2ai?(ai?+1)?
最后因為是個環,所以初始應該欽定 111 的選擇
顯然這個 dpdpdp 的過程并沒有考慮 min?{ci}=0\min\{c_i\}=0min{ci?}=0 的限制,而是隨意轉移
所以利用容斥,減去強制至少轉移一個球的方案數,就對應著至少有一個人的 ci=0c_i=0ci?=0 的方案數
具體而言:
-
iii 從自己手上剩的球選擇,剩的球就被限制為了 1,2,...,ai?11,2,...,a_{i-1}1,2,...,ai?1?
轉移變為 dpi+1,0←dpi,0?ai(ai?1)2dp_{i+1,0}\leftarrow dp_{i,0}·\frac{a_i(a_i-1)}{2}dpi+1,0?←dpi,0??2ai?(ai??1)?
-
iii 傳遞給 i+1i+1i+1 至少都是一個球 1,2,...,ai1,2,...,a_i1,2,...,ai?
轉移變為 dpi+1,0←dpi,1?aidp_{i+1,0}\leftarrow dp_{i,1}·a_idpi+1,0?←dpi,1??ai?
-
而 case3 case4 的轉移,因為為了使 (x1)\binom{x}{1}(1x?) 有意義,所以 xxx 自帶條件就是 ≥1\ge 1≥1,轉移不變
code
#include <cstdio> #include <cstring> #define int long long #define mod 998244353 #define maxn 300005 const int inv2 = ( mod + 1 ) / 2; const int inv6 = ( mod + 1 ) / 6; int n; int a[maxn]; int dp[maxn][2];int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans; }int solve( int o, int k ) {memset( dp, 0, sizeof( dp ) );dp[1][o] = 1;for( int i = 1, x, g, f;i <= n;i ++ ) {x = a[i] - k;g = x * ( x + 1 ) % mod * inv2 % mod;dp[i + 1][0] = ( dp[i][0] * g + dp[i][1] * ( x + 1 ) ) % mod;x = a[i];g = x * ( x + 1 ) % mod * inv2 % mod;f = x * ( x + 1 ) % mod * ( x << 1 | 1 ) % mod * inv6 % mod;dp[i + 1][1] = ( ( a[i] * g - f ) % mod * dp[i][0] + dp[i][1] * g ) % mod;}return dp[n + 1][o]; }signed main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &a[i] );printf( "%lld\n", ( ( solve( 1, 0 ) + solve( 0, 0 ) - solve( 0, 1 ) - solve( 1, 1 ) ) % mod + mod ) % mod );return 0; }總結
以上是生活随笔為你收集整理的[AtCoder Regular Contest 124E] Pass to Next(dp+数学)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一键转换表格格式一键转换表格格式的软件
- 下一篇: 把路由器IP改成和电脑IP同一网段的方法