Problem

loj3093 & x谷

题意概要:给定 \(n\) 块玻璃,每块玻璃有其折射比例与反射比例(折射比例+反射比例 不一定为 \(100\%\)),求从最上头打下一束光,有多少比例的光可以完全穿越 \(n\) 块玻璃

\(n\leq 5\times 10^5\)

Solution

一眼线性高斯消元,但是我懒……物理题当然不要那么麻烦啦

由于考虑到这是物理模型,用物理思想考虑——合并玻璃

仅考虑合并两块玻璃,对于合并后的等价玻璃,需要算出其 从上往下与从下往上的反射透射率 共四个参数。但是我懒……由于不需要知道最上层玻璃 从上往下的反射率 与 从下往上的透射率,所以可以考虑每次合并最顶上的两块玻璃,只需要计算两个参数

从上往下透射率:

考虑到整体透射过去的光就是透射过第二块玻璃的光,而由于一部分光可能在两块玻璃间反射,所以透射过去的光分为无穷多段,但最终的总和是收敛的(设第一块玻璃透射率为 \(a_1\),反射率为 \(b_1\),第二块玻璃透射率为 \(a_2\),反射率为 \(b_2\)):

  • 第一束光:\(a_1a_2\)(直接透过两块玻璃)
  • 第二束光:\(a_1a_2b_1b_2\)(在两块玻璃间反射一个来回后透射出去)
  • 第三束光:\(a_1a_2(b_1b_2)^2\)(反射两个来回)
  • ……

求和为 \(\sum_{i=0}^{+\infty}a_1a_2(b_1b_2)^i=\frac {a_1a_2(1-(b_1b_2)^{+\infty})}{1-b_1b_2}\)

由于 \(b_1b_2<1\)

\[a'=\lim_{n\rightarrow +\infty}\frac {a_1a_2(1-(b_1b_2)^n)}{1-b_1b_2}=\frac {a_1a_2}{1-b_1b_2}
\]

从下往上反射率:

类似于上面的方法:

  • 第一束光:\(b_2\)(直接反射)
  • 第二束光:\(a_2^2b_1\)(在第一块玻璃反射一次,穿越两次第二块玻璃)
  • 第三束光:\(a_2^2b_1^2b_2\)(在中间多一个反射来回)

求和:

\[b'=b_2+\lim_{n\rightarrow +\infty}\frac {a_2^2b_1(1-(b_1b_2)^n)}{1-b_1b_2}=b_2+\frac {a_2^2b_1}{1-b_1b_2}
\]

从上到下合并所有玻璃后最后一块玻璃的透射率即为答案

Code

#include <bits/stdc++.h>
typedef long long ll; inline void read(int&x){
char c11=getchar();x=0;while(!isdigit(c11))c11=getchar();
while(isdigit(c11))x=x*10+c11-'0',c11=getchar();
} const int p = 1e9+7, inv = 570000004; inline int qpow(int A,int B) {
int res = 1;
while(B) {
if(B&1) res = (ll)A * res%p;
A = (ll)A * A%p, B >>= 1;
} return res;
} int n, a1, a2, b1, b2, a, b, iv; int main() {
read(n);
read(a1), a1 = (ll)a1 * inv%p;
read(b1), b1 = (ll)b1 * inv%p;
while(--n) {
read(a2), a2 = (ll)a2 * inv%p;
read(b2), b2 = (ll)b2 * inv%p;
iv = qpow(p+1 - (ll)b1 * b2%p, p-2);
a = (ll)a1 * a2%p * iv%p;
b = (b2 + (ll)a2 * a2%p * b1%p * iv)%p;
a1 = a, b1 = b;
}
printf("%d\n",a1);
return 0;
}

题解-BJOI2019 光线的更多相关文章

  1. [BJOI2019]光线(递推)

    [BJOI2019]光线(递推) 题面 洛谷 题解 假装玻璃可以合并,假设前面若干玻璃的透光率是\(A\),从最底下射进去的反光率是\(B\),当前的玻璃的透光率和反光率是\(a,b\). 那么可以得 ...

  2. [BJOI2019]光线——递推

    题目链接: [BJOI2019]光线 设$F_{i}$表示从第$1$面玻璃上面向下射入一单位光线,穿过前$i$面玻璃的透光率. 设$G_{i}$表示从第$i$面玻璃下面向上射入一单位光线,穿过前$i$ ...

  3. [BJOI2019]光线[递推]

    题意 题目链接 分析 令 \(f_i\) 表示光线第一次从第一块玻璃射出第 \(i\) 块玻璃的比率. 令 \(g_i\) 表示光线射回第 \(i\) 块玻璃,再射出第 \(i\) 块玻璃的比率. 容 ...

  4. luogu P5323 [BJOI2019]光线

    传送门 先考虑\(n=1\)的情况不是输入数据都告诉你了吗 然后考虑\(n=2\),可以光线是在弹来弹去的废话,然后射出去的光线是个等比数列求和的形式,也就是\(x_1\sum_{i=1}^{\inf ...

  5. [BJOI2019] 光线

    看起来很麻烦,做起来并不难的题 以下设:$a_i=\frac{a_i}{100},b_i=\frac{b_i}{100}$ 显然,如果$b_i=0$的话,直接求$\Pi a_i$就是答案. 解决反射问 ...

  6. [洛谷P5323][BJOI2019]光线

    题目大意:有$n$层玻璃,每层玻璃会让$a\%$的光通过,并把$b\%$的光反射.有一束光从左向右射过,问多少的光可以透过这$n$层玻璃 题解:事实上会发现,可以把连续的几层玻璃合成一层玻璃,但是要注 ...

  7. [BJOI2019]光线(DP)

    降智了…… 当你走头无路的时候就应该知道瞎搞一个DP: $p[i]$ 表示光射入第 $1$ 块玻璃时,从第 $i$ 块玻璃出去的光量. $q[i]$ 表示光射入第 $i$ 块玻璃时,从第 $i$ 块玻 ...

  8. 题解 [BJOI2019]奥术神杖

    题目传送门 题目大意 给出一个残缺的字符串,每个位置都 \(\in[0,9]\).有 \(m\) 中贡献,即 \(s,k\),表示该字符串中没出现一次 \(s\),贡献便乘上 \(k\).最后对贡献求 ...

  9. BJOI2019 题解

    BJOI2019 题解 在更了在更了 P5319 [BJOI2019]奥术神杖 对\(V_i\)求个\(\ln\)变成了让平均数最大,显然套分数规划,然后ac自动机上面dp #include<b ...

随机推荐

  1. Springcloud zuul和shiro结合

    一.目标1.外部请求统一从网关zuul进入,并且服务内部互相调用接口要校验权限 2.cloud和shiro结合,达到单点登录,和集中一个服务完成权限管理,其他业务服务不需要关注权限如何实现 3.其他服 ...

  2. Photoshop入门教程图解版

  3. feilong's blog | 目录

    每次把新博客的链接分享到技术群里,我常常会附带一句:蚂蚁搬家.事实上也确实如此,坚持1篇1篇的把自己做过.思考过.阅读过.使用过的技术和教育相关的知识.方法.随笔.索引记录下来,并持续去改进它们,希望 ...

  4. kettle变量(var变量)

    设置变量/set varibale 1.定义变量(子转换): 原始数据 设置获取变量:点击获取字段,自动获取变量名称和字段名称 引用变量: 输出: kettle.properties 文件存储在.ke ...

  5. DAY25、面向对象总复习

    面向对象总复习:面向过程编程思想: 核心是 过程 二字, 过程指的是解决问题的步骤是,即先干什么再干什么. 基于该编程思想编写程序,相当于一条流水线,一种机械式的思维方式. 面向对象编程思想: 核心是 ...

  6. PHP——??空合并运算符和?:三元运算符

    前言 在上一篇随笔,用三元运算符简单写的一个东西,引发了对他的兴趣,所以打算研究下. PHP7的新特性: https://php.net/manual/zh/migration70.new-featu ...

  7. leanote折腾指南

    持续更新. 过几天把自己的修改好的css放到github上给大家参考. https://github.com/whuwangyong/leanote-conf TODO leanote Linux/W ...

  8. centos7升级内核至最新

    应用背景: 最近在接触docker,其对内核版本要求较高,就连目前使用的centos7.x默认内核版本为3.10.0-xxx,也是刚好满足其最低要求,故借此机会记录一下升级内核的操作步骤. 测试环境: ...

  9. CF235B Let's Play Osu! 期望DP

    貌似是一道很裸的期望\(DP\).直接说思路: 设\(f[i]\)表示到\(i\)位置时的期望分数,但是只有\(f[i]\)的话我们发现是无法转移的,我们还需要知道到\(i\)位置时的期望连续长度,于 ...

  10. 实验一 Java开发环境的熟悉(Linux + Eclipse)

    学号 20175206 实验一 <Java开发环境的熟悉>实验报告 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实 ...