题目链接:流星雨


比较简单的概率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;
}