【BJOI2019】光线 模拟
题目大意:有一束光线要依次穿过n块玻璃。
第i块玻璃的透射率为ai,反射率为bi。
问你有多少光能最终穿过所有玻璃。
数据范围:n≤5×105,答案对998244353取模。
我们考虑暴力把前i−1块玻璃看做一块玻璃,我们计算出了这块玻璃的透射率为a,反射率为b。
假设当前射过来的光线为x,第i块玻璃的透射率为A,反射率为B。
我们考虑强行打表:
第一次穿过玻璃i的光线量为Ax。
第二次为ABbx
第三次为AB2b2x
.....
以此类推。
考虑到Bb是小于1的,根据等比数列求和公式,最终能穿过玻璃i的光线总量为:
X=xA×Bb1−Bb
我们考虑如何更新a和b。
我们按照上面强行打表的方式打一个表,发现:
newa=Aa×Bb1−Bb
newb=B+A2b×Bb1−Bb
直接处理就行了,复杂度O(nlogMOD)
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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!