抽卡(概率论)
思路:反向考虑, p a n s = 1 − p ( 一 张 卡 都 抽 不 到 ) p_{ans}=1-p_{(一张卡都抽不到)} pans=1−p(一张卡都抽不到)
第 i i i个卡池抽不到卡的概率为 p i = a i − b i a i p_i=\dfrac{a_i-b_i}{a_i} pi=aiai−bi
因为每个事件是独立事件,
所以: p ( 一 张 卡 都 抽 不 到 ) = p 1 × p 2 ⋯ × p n p_{(一张卡都抽不到)}=p_1\times p_2\dots\times p_n p(一张卡都抽不到)=p1×p2⋯×pn
对于除法取余,就是求逆元,这里用费马小定理即可。
时间复杂度: n l o g ( m o d ) nlog(mod) nlog(mod)
附上
n
n
n个独立事件和概率公式:
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
int a[N],b[N];
ll ksm(ll a,ll n){
ll ans=1;
while(n){
if(n&1) ans=ans*a%mod;
a=a*a%mod;
n>>=1;
}
return ans;
}
ll inv(ll a,ll b){
return a*ksm(b,mod-2)%mod;
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=0;i<n;i++) scanf("%d",&b[i]),b[i]=a[i]-b[i];
ll ans=1;
for(int i=0;i<n;i++)
ans=ans*inv(b[i],a[i])%mod;
printf("%lld\n",(mod+(1-ans))%mod);
return 0;
}