题目链接:流星雨
比较简单的概率dp,我们令dp[i]为第i天,下流星雨的概率,然后就不难递推了。
最后乘以下流星雨的个数即可。
AC代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int p=1e9+7;
const int N=1e5+10;
int n,a,b,x,y,w[N],inv,dp[N],res;
int qmi(int a,int b=p-2){
int res=1;
while(b){if(b&1) res=res*a%p; b>>=1; a=a*a%p;}
return res;
}
signed main(){
cin>>n>>a>>b; inv=a*qmi(b)%p;
for(int i=1;i<=n;i++) scanf("%lld",&w[i]);
for(int i=1;i<=n;i++){
scanf("%lld %lld",&x,&y);
dp[i]=dp[i-1]*((inv+x*qmi(y)%p)%p)%p+(1-dp[i-1]+p)%p*(x*qmi(y)%p)%p;
dp[i]%=p;
res=(res+dp[i]*w[i]%p)%p;
}
cout<<res<<endl;
return 0;
}