P5323 [BJOI2019]光线

又是一道啊
题意简述:
有面玻璃,第面的透光率为,反射率为
问把这面玻璃按顺序叠在一起后层玻璃的透光率。
,。
首先是物理题,需要一点物理题的经典思路:合并模型
考虑把n面玻璃两两合并为1面
设a1为合并过程中第1面镜子透光率,b1位第一面镜子反光率
先求新a1
- 第一束光:(直接过)
- 第二束光:(反弹一次)
- 第三束光:反弹两次
又因为一定收敛:
再求新b1
-
第一束光:(直接反射)
-
第二束光: (第二块玻璃反射一次再穿越第一块两次)
-
第三束光:
按此方法合并即可
code:
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
namespace fastIO {
#define BUF_SIZE (1<<19)
static char buf[BUF_SIZE],*p1=BUF_SIZE+buf,*pend=BUF_SIZE+buf;
inline char nc() {
if(p1==pend) {
p1=buf;
pend=buf+fread(buf,1,BUF_SIZE,stdin);
}
return *p1++;
}
inline int read() {
int x=0,f=1;
char s=nc();
for(; !isdigit(s); s=nc())if(s=='-')f=-1;
for(; isdigit(s); s=nc())x=(x<<1)+(x<<3)+s-'0';
return x*f;
}
}
using namespace fastIO;
const int P=1e9+7,inv=570000004;
//inv是100的逆元
inline ll ksm(ll x,int y) {
ll ans=1;
while(y) {
if(y&1)ans=ans*x%P;
x=x*x%P;
y>>=1;
}
return ans;
}
int n,a1,a2,b1,b2,a,b,iv;
int main() {
//freopen("test.in","r",stdin);
n=read();
a1=read(),a1=1ll*a1*inv%P;
b1=read(),b1=1ll*b1*inv%P;
while(--n) {
a2=read();
a2=1ll*a2*inv%P;
b2=read();
b2=1ll*b2*inv%P;
iv=ksm(P+1-1ll*b1*b2%P,P-2);
//套用公式
a=1ll*a1*a2%P*iv%P;
b=(b2+1ll*a2*a2%P*b1%P*iv)%P;
a1=a,b1=b;
}
printf("%d\n",a1);
return 0;
}