这道题用到了很多知识,我学习了很久才做出来,包括:
1.动态规划思想,存储每个高度的期望值。
找出递推式。
如上图,当站在n-1的高度,望向n的高度时,甲壳虫有两种命运,有可能以概率(1-Pn)成功突破,也有可能以Pn的概率重头来过,前者花时间为1,后者花时间为1+En,没错,就是1+En,向上的一步加上从零开始爬到高度n的期望。
2.乘法逆元求解,此处特殊化,可以使用费马小定理。
可以参考学习这篇博客,讲的很好。
乘法逆元详解 - MJT12044 - 博客园 (cnblogs.com)
3.快速幂算法
可以参考学习这篇文章:
算法学习笔记(4):快速幂 - 知乎 (zhihu.com)
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
ll qpow(ll num, ll pow, ll p){
ll ans=1;
while(pow){
if(pow&1) ans=ans*num;
num*=num;
ans%=p;
num%=p;
pow >>= 1;
}
return ans;
}//快速幂
int main(){
ll x,y,n;
ll p=998244353;
cin>>n;
ll E[n];
E[0]=0;
ll i;
for(i=1;i<=n;i++){
cin>>x;
cin>>y;
E[i]=((E[i-1]+1)%p*(y%p))%p;
E[i]*=qpow(y-x,p-2,p);
E[i]%=p;
}
cout<<E[n];
return 0;
} //概率期望、乘法逆元
如有帮助,请勿吝赞。^_^