题意:
现在一共有n天,第i天如果有流星雨的话,会有wi
第i天有流星雨的概率是pi
如果第一天有流星雨了,那么第二天有流星雨的可能性是p2+P
第i−1 (i≥2)天有流星雨,第i天有流星雨的可能性是pi+P,否则是pi。求n天后,流星雨颗数的期望。
解法:
设Ti 为第i天下雨的真正概率,由于第i天的概率只与第i-1天有关,所以有
Ti=Ti−1×(pi+P)+(1−Ti−1)×pi
复杂度:加上求逆元的复杂度,O(nlogn)
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll p[100010],w[100010],dp[100010];
const ll mod=1e9+7;
ll npow(ll a,ll n){
ll ans=1;
while(n){
if(n&1){
ans=ans*a%mod;
}
a=a*a%mod;
n>>=1;
}
return ans;
}
int main(){
ll n,a,b,P;
cin>>n>>a>>b;
P=a*npow(b,mod-2)%mod;//求完逆元要乘上a再求模
for(int i=1;i<=n;i++){
cin>>w[i];
}
for(int i=1;i<=n;i++){
ll x,y;
cin>>x>>y;
p[i]=x*npow(y,mod-2)%mod;
// cout<<p[i]<<endl;
}
ll ans=0;dp[1]=p[1];
for(int i=2;i<=n;i++){
dp[i]=((dp[i-1]*(p[i]+P)%mod)%mod+((1-dp[i-1]+mod)%mod*p[i])%mod)%mod;
}
for(int i=1;i<=n;i++){
ans=(ans+(dp[i]*w[i]%mod))%mod;
// ans%=mod;
}
cout<<ans<<endl;
}