一个长为 的序列 ,从 开始标号,一开始全为 ,现在小 C 想对它进行 次操作。对第 次操作,他会选定恰好一个二元组 ()并令 ,其中选中二元组 的概率为 。小 C 本来是想问你区间最大值的历史版本和的历史最大值的期望的,但鉴于这是一道签到题,现在他只想知道 次操作后整个序列最大值的期望,对 取模。
Constraints
, ,
Solution
令 表示 在经过集合 的操作后,值为 的概率。
令 表示前 个元素,用掉了集合 的操作,最大值为 的概率,可得:
详见代码。
Code
1 |
|
Living is do or die.
一个长为 n 的序列 A,从 1 开始标号,一开始全为 0,现在小 C 想对它进行 m 次操作。对第 i 次操作,他会选定恰好一个二元组 (j,k)(1≤j≤n,0≤k≤c)并令 Aj=Aj+k,其中选中二元组 (j,k) 的概率为 Pi,j,k。小 C 本来是想问你区间最大值的历史版本和的历史最大值的期望的,但鉴于这是一道签到题,现在他只想知道 m 次操作后整个序列最大值的期望,对 109+7 取模。
n≤40 , m≤10 , c≤3
令 f(i,S,j) 表示 Ai 在经过集合 S 的操作后,值为 j 的概率。
令 dp(i,S,j) 表示前 i 个元素,用掉了集合 S 的操作,最大值为 j 的概率,可得:
dp(i,S1,j)×f(i+1,S2,k)=dp(i+1,S1+S2,max(j,k))
详见代码。
1 | #include<cstdio> |