关于一类期望 dp 的公式推导

想写但想不起来写啥🤣
orz 宝爷
orz 📕

\(\tt Beautiful\ Mirrors[5.0|B^x]\)

以下默认 \(p_i \leftarrow \dfrac{p_i}{100}\)
显然有转移方程

\[\Large f_i=p_i\times f_{i+1}+(1-p_i)\times f_1+1 \]

\(f_i=g(i)\times f_1\),带入式子:

\[\Large g(i)\times f_1=p_i\times g(i+1)\times f_{1}+(1-p_i)\times f_1+1 \]

\[\Large g(i+1)=\dfrac{g(i)+p_i-1-\frac{1}{f_1}}{p_i} \]

怎么还有 \(f_1\) 啊。🤬
\(\dfrac{1}{f_1}=x\),所有的 \(g(i)\) 都可以表示成 \(k_i\times x+b_i\) 的形式。
用一个结构体维护一下即可。
\(g(1)=1(k_i=0,b_i=1)\),可以递归求所有 \(g(i)\)
\(g(n+1)=f_{n+1}=0\),可以解出 \(x=-\dfrac{b_{n+1}}{k_{n+1}}\)
\(f_1=\dfrac{1}{x}\) 即为答案。
还有这博客的公式大小锅的这么明显 🤡👈🤣
代码拣着重要的放上来了😘

struct node{int k,b;}g[maxn];//该数可以表示成 kx+b 的形式 
int inv(int x){
	return ksm(x,mo-2);
}
int n,p[maxn],ip[maxn];
signed main(){
	cin>>n;g[1]={0,1};
	for(int i=1;i<=n;i++)
		cin>>p[i],p[i]=(1ll*p[i]*inv(100))%mo,ip[i]=inv(p[i]);
	for(int i=2;i<=n+1;i++)
		g[i]={(1ll*(g[i-1].k+mo-1)*ip[i-1])%mo,(1ll*(g[i-1].b+p[i-1]-1+mo)*ip[i-1])%mo};
	int x=((mo-g[n+1].k)*inv(g[n+1].b))%mo;
	cout<<x<<endl;
} 
posted @ 2023-10-05 17:36  ReTF  阅读(34)  评论(0编辑  收藏  举报