题目链接:
设$F_{i}$表示从第$1$面玻璃上面向下射入一单位光线,穿过前$i$面玻璃的透光率。
设$G_{i}$表示从第$i$面玻璃下面向上射入一单位光线,穿过前$i$面玻璃的反光率。
那么可以推出:
$F_{i}=F_{i-1}a_{i}sumlimits_{k=0}^{+infty}(G_{i-1}b_{i})^k$
$G_{i}=b_{i}+G_{i-1}a_{i}^2sumlimits_{k=0}^{+infty}(G_{i-1}b_{i})^k$
后面那部分显然是个等比数列,因为$x<1$,所以$sumlimits_{k=0}^{+infty}x^k=frac{1}{1-x}$。
最后的递推式为:
$F_{i}=frac{F_{i-1}a_{i}}{1-G_{i-1}b_{i}}$
$G_{i}=b_{i}+frac{G_{i-1}a_{i}^2}{1-G_{i-1}b_{i}}$
直接递推即可。
#include<set> #include<map> #include<queue> #include<stack> #include<cmath> #include<cstdio> #include<vector> #include<bitset> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int mod=1000000007; int n,inv; int a,b; int F,G; int quick(int x,int y) { int res=1; while(y) { if(y&1) { res=1ll*x*res%mod; } y>>=1; x=1ll*x*x%mod; } return res; } int main() { scanf("%d",&n); inv=quick(100,mod-2); F=1; for(int i=1;i<=n;i++) { scanf("%d%d",&a,&b); a=1ll*a*inv%mod,b=1ll*b*inv%mod; int res=quick((1-1ll*G*b%mod+mod)%mod,mod-2); F=1ll*F*a%mod*res%mod; G=(b+1ll*a*a%mod*G%mod*res%mod)%mod; } printf("%d",F); }