• [BJOI2019]光线——递推


    原题看我

    题解

    如果能把多块玻璃合并到一起多棒啊,但是直接把多块合并似乎不太可能,考虑两两合并
    也就是已知上下层玻璃的透光率分别为(a_1\%)(a_2\%),反射率分别为(b_1\%)(b_2\%),求一块等效的玻璃,使得它和两块玻璃叠在一起的效果相同
    (有一点要注意一下,就是合并后的玻璃上下的反射率和透光率不一定相同,我们需要根据合并的方向来判断要计算的是哪一个
    也就是下面这两幅图,为了方便,将(x\%)省略成(x)
    1.
    即合并后的透光率为(a_1a_2sumlimits_{i=0}^{infty}(b_1b_2)^i=frac{a_1a_2}{1-b_1b_2})
    2.
    即合并后的(向下的)反射率为(b_2+a_2^2b_1sumlimits_{i=0}^{infty}(b_1b_2)^i=frac{a_2^2b_1}{1-b_1b_2}+b_2)
    (P.S. 图中左下角的那个应该是(b_2))
    这样我们就可以(O(n))的递推了
    代码如下:

    #include <algorithm>
    #include  <iostream>
    #include   <cstdlib>
    #include   <cstring>
    #include    <cstdio>
    #include    <string>
    #include    <vector>
    #include     <cmath>
    #include     <ctime>
    #include     <queue>
    #include       <map>
    #include       <set>
    
    using namespace std;
    
    #define ull unsigned long long
    #define pii pair<int, int>
    #define uint unsigned int
    #define mii map<int, int>
    #define lbd lower_bound
    #define ubd upper_bound
    #define INF 0x3f3f3f3f
    #define IINF 0x3f3f3f3f3f3f3f3fLL
    #define vi vector<int>
    #define ll long long
    #define mp make_pair
    #define pb push_back
    #define re register
    #define il inline
    
    #define MOD 1000000007
    
    int n;
    int p100;
    int A, B;
    
    int fpow(int x, int p) {
      int ret = 1;
      while(p) {
        if(p&1) ret = 1LL*ret*x%MOD;
        x = 1LL*x*x%MOD;
        p >>= 1;
      }
      return ret;
    }
    
    int read() {
      int t;
      scanf("%d", &t);
      return 1LL*t*p100%MOD;
    }
    
    int main() {
      scanf("%d", &n);
      p100 = fpow(100, MOD-2);
      A = read(), B = read();
      for(int i = 2, a, b, t; i <= n; ++i) {
        a = read(), b = read();
        t = fpow((1-1LL*B*b%MOD+MOD)%MOD, MOD-2);
        A = 1LL*A*a%MOD*t%MOD;
        B = (1LL*a*a%MOD*B%MOD*t%MOD+b)%MOD;
      }
      printf("%d
    ", A);
      return 0;
    }
    
  • 相关阅读:
    使用winmm.dll 获取麦克风声音数据
    什么是拆箱和装箱?
    C#窗体程序【用户控件-窗体】委托事件
    如何在网页标题栏加入logo图标?
    C#汉字转拼音帮助类
    JQuery中$.ajax()方法参数详解
    UEditor独立图片、文件上传模块
    SqlServer2008安装时提示重启计算机失败 解决办法
    如果说人生是自我编写的程序
    LINQ的Any() 方法
  • 原文地址:https://www.cnblogs.com/dummyummy/p/10921250.html
Copyright © 2020-2023  润新知