有 n n n 块玻璃叠在一起,每块玻璃有透光率 a i / 100 a_i/100 ai/100 和折光率 b i / 100 b_i/100 bi/100 ,若射入第一块玻璃的光为1份,求透过所有玻璃的光模 1 0 9 + 7 10^9+7 109+7。 n ≤ 5 × 1 0 5 n\leq 5\times 10^5 n≤5×105。
纯推式子题,给定两个数组 P 1... n , Q 1... n P_{1...n},Q_{1...n} P1...n,Q1...n ,表示从第 i i i 块玻璃传出/传回的光线。
(算式中用到的
a
,
b
a,b
a,b 数组已经是处理后的模数意义下的分数数组)可以得到最基本的两个式子:
P
i
=
P
i
−
1
×
a
i
+
Q
i
×
b
i
P_i=P_{i-1}\times a_i+Q_i\times b_i
Pi=Pi−1×ai+Qi×bi
Q
i
=
P
i
×
b
i
+
1
+
Q
i
+
1
×
a
i
+
1
Q_i=P_i\times b_{i+1}+Q_{i+1}\times a_{i+1}
Qi=Pi×bi+1+Qi+1×ai+1
对第一个式子进行变形
P
i
+
1
=
P
i
×
a
i
+
1
+
Q
i
+
1
×
b
i
+
1
P_{i+1}=P_i\times a_{i+1}+Q_{i+1}\times b_{i+1}
Pi+1=Pi×ai+1+Qi+1×bi+1
P
i
×
a
i
+
1
=
P
i
+
1
−
Q
i
+
1
×
b
i
+
1
P_i\times a_{i+1}=P_{i+1}-Q{i+1}\times b_{i+1}
Pi×ai+1=Pi+1−Qi+1×bi+1
P
i
=
P
i
+
1
−
Q
i
+
1
×
b
i
+
1
a
i
+
1
P_i=\frac{P_{i+1}-Q_{i+1}\times b_{i+1}}{a_{i+1}}
Pi=ai+1Pi+1−Qi+1×bi+1
从这个式子和最上面的2式,可以从第
i
i
i 项的
P
,
Q
P,Q
P,Q 推出第
i
−
1
i-1
i−1 项,所以可以设
P
n
=
1
P_n=1
Pn=1 反推出
P
0
P_0
P0 最后在求
P
0
P_0
P0 逆元即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define P 1000000007
ll Mul(ll a,ll b){
ll ret=1;
while(b){
if(b&1){
ret=ret*a%P;
}
b>>=1;
a=a*a%P;
}
return ret;
}
ll n,a[500005],b[500005];
ll p[500005],q[500005];
ll m100;
int main(){
scanf("%lld",&n);
m100=Mul(100,P-2);
for(int i=1;i<=n;++i){
scanf("%lld %lld",&a[i],&b[i]);
a[i]=a[i]*m100%P;
b[i]=b[i]*m100%P;
}
p[n]=1;
q[n]=0;
for(int i=n-1;i>=0;--i){
p[i]=(((p[i+1]-((q[i+1]*b[i+1])%P)+P)%P)*Mul(a[i+1],P-2))%P;
q[i]=(p[i]*b[i+1]%P+q[i+1]*a[i+1]%P)%P;
}
printf("%lld\n",Mul(p[0],P-2));
return 0;
}