zoukankan      html  css  js  c++  java
  • 【BJOI2019】光线 模拟

    题目大意:有一束光线要依次穿过$n$块玻璃。

    第i块玻璃的透射率为$a_i$,反射率为$b_i$。

    问你有多少光能最终穿过所有玻璃。

    数据范围:$n≤5 imes 10^5$,答案对$998244353$取模。

    我们考虑暴力把前$i-1$块玻璃看做一块玻璃,我们计算出了这块玻璃的透射率为$a$,反射率为$b$。

    假设当前射过来的光线为$x$,第$i$块玻璃的透射率为$A$,反射率为$B$。

    我们考虑强行打表:

    第一次穿过玻璃i的光线量为$Ax$。

    第二次为$ABbx$

    第三次为$AB^2b^2x$

    .....

    以此类推。

    考虑到$Bb$是小于$1$的,根据等比数列求和公式,最终能穿过玻璃$i$的光线总量为:

    $X=xA imesdfrac{Bb}{1-Bb}$

    我们考虑如何更新$a$和$b$。

    我们按照上面强行打表的方式打一个表,发现:

    $newa=Aa imesdfrac{Bb}{1-Bb}$

    $newb=B+A^2b imesdfrac{Bb}{1-Bb}$

    直接处理就行了,复杂度$O(nlog 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 }
  • 相关阅读:
    yum和apt-get用法及区别
    Vim终极指南:所思即所得
    Vim 操作符命令和动作命令
    vim中文手册
    标准代码页(codepage)列表
    中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030
    vim在系统剪切板的复制与粘贴
    linux中高亮显示文本的工具 -- bat
    pandas category数据类型
    pandas 数据类型转换
  • 原文地址:https://www.cnblogs.com/xiefengze1/p/10777735.html
Copyright © 2011-2022 走看看