題目大意:有一束光線要依次穿過$n$塊玻璃。c++
第i塊玻璃的透射率爲$a_i$,反射率爲$b_i$。spa
問你有多少光能最終穿過全部玻璃。code
數據範圍:$n≤5\times 10^5$,答案對$998244353$取模。blog
咱們考慮暴力把前$i-1$塊玻璃看作一塊玻璃,咱們計算出了這塊玻璃的透射率爲$a$,反射率爲$b$。ci
假設當前射過來的光線爲$x$,第$i$塊玻璃的透射率爲$A$,反射率爲$B$。it
咱們考慮強行打表:class
第一次穿過玻璃i的光線量爲$Ax$。反射
第二次爲$ABbx$im
第三次爲$AB^2b^2x$數據
.....
以此類推。
考慮到$Bb$是小於$1$的,根據等比數列求和公式,最終能穿過玻璃$i$的光線總量爲:
$X=xA\times\dfrac{Bb}{1-Bb}$
咱們考慮如何更新$a$和$b$。
咱們按照上面強行打表的方式打一個表,發現:
$newa=Aa\times\dfrac{Bb}{1-Bb}$
$newb=B+A^2b \times\dfrac{Bb}{1-Bb}$
直接處理就好了,複雜度$O(n\log MOD)$
1 #include<bits/stdc++.h> 2 #define L long long 3 #define MOD 1000000007 4 #define I(x) pow_mod(x,MOD-2) 5 using namespace std; 6 L pow_mod(L x,L k){L ans=1;for(;k;k>>=1,x=x*x%MOD) if(k&1) ans=ans*x%MOD; return ans;} 7 8 int main(){ 9 L a=1,b=0,x=1,I100=I(100); 10 int n; cin>>n; 11 while(n--){ 12 L A,B; scanf("%lld%lld",&A,&B); 13 A=A*I100%MOD; B=B*I100%MOD; 14 L Bb=B*b%MOD; 15 Bb=I(1-Bb+MOD)%MOD; 16 x=x*A%MOD*Bb%MOD; 17 L newa=A*a%MOD*Bb%MOD; 18 L newb=(B+A*A%MOD*b%MOD*Bb)%MOD; 19 a=newa; b=newb; 20 } 21 cout<<x<<endl; 22 }