题解-BJOI2019 光线
Problem
题意概要:给定 \(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\)
\]
从下往上反射率:
类似于上面的方法:
- 第一束光:\(b_2\)(直接反射)
- 第二束光:\(a_2^2b_1\)(在第一块玻璃反射一次,穿越两次第二块玻璃)
- 第三束光:\(a_2^2b_1^2b_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 光线的更多相关文章
- [BJOI2019]光线(递推)
[BJOI2019]光线(递推) 题面 洛谷 题解 假装玻璃可以合并,假设前面若干玻璃的透光率是\(A\),从最底下射进去的反光率是\(B\),当前的玻璃的透光率和反光率是\(a,b\). 那么可以得 ...
- [BJOI2019]光线——递推
题目链接: [BJOI2019]光线 设$F_{i}$表示从第$1$面玻璃上面向下射入一单位光线,穿过前$i$面玻璃的透光率. 设$G_{i}$表示从第$i$面玻璃下面向上射入一单位光线,穿过前$i$ ...
- [BJOI2019]光线[递推]
题意 题目链接 分析 令 \(f_i\) 表示光线第一次从第一块玻璃射出第 \(i\) 块玻璃的比率. 令 \(g_i\) 表示光线射回第 \(i\) 块玻璃,再射出第 \(i\) 块玻璃的比率. 容 ...
- luogu P5323 [BJOI2019]光线
传送门 先考虑\(n=1\)的情况不是输入数据都告诉你了吗 然后考虑\(n=2\),可以光线是在弹来弹去的废话,然后射出去的光线是个等比数列求和的形式,也就是\(x_1\sum_{i=1}^{\inf ...
- [BJOI2019] 光线
看起来很麻烦,做起来并不难的题 以下设:$a_i=\frac{a_i}{100},b_i=\frac{b_i}{100}$ 显然,如果$b_i=0$的话,直接求$\Pi a_i$就是答案. 解决反射问 ...
- [洛谷P5323][BJOI2019]光线
题目大意:有$n$层玻璃,每层玻璃会让$a\%$的光通过,并把$b\%$的光反射.有一束光从左向右射过,问多少的光可以透过这$n$层玻璃 题解:事实上会发现,可以把连续的几层玻璃合成一层玻璃,但是要注 ...
- [BJOI2019]光线(DP)
降智了…… 当你走头无路的时候就应该知道瞎搞一个DP: $p[i]$ 表示光射入第 $1$ 块玻璃时,从第 $i$ 块玻璃出去的光量. $q[i]$ 表示光射入第 $i$ 块玻璃时,从第 $i$ 块玻 ...
- 题解 [BJOI2019]奥术神杖
题目传送门 题目大意 给出一个残缺的字符串,每个位置都 \(\in[0,9]\).有 \(m\) 中贡献,即 \(s,k\),表示该字符串中没出现一次 \(s\),贡献便乘上 \(k\).最后对贡献求 ...
- BJOI2019 题解
BJOI2019 题解 在更了在更了 P5319 [BJOI2019]奥术神杖 对\(V_i\)求个\(\ln\)变成了让平均数最大,显然套分数规划,然后ac自动机上面dp #include<b ...
随机推荐
- [题解]NOIP2018(普及组)T1标题统计(title)
NOIP2018(普及组)T1标题统计(title) 题解 [代码(AC)] #include <iostream> #include <cstdio> #include &l ...
- Python两个栈实现一个队列
牛客网原题: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 实现这个算法的方式有很多种,这里就写一种比较简单易懂的:虽然可能算法和效率上不太出色,当大多数人 ...
- ABP实践(2)-ASP.NET Core 2.x版本EntityFrameworkCore(EF)使用mysql数据库
上一篇中EntityFrameworkCore默认使用的是微软的sql server,本篇改为mysql步骤如下: 1,在基础层xxx.EntityFrameworkCore依赖项添加Pomelo.E ...
- js中对象引用出现的问题
先看一个特别不符合直觉的代码 <script type="text/javascript"> var a = [1,2,3,4]; var b = [1,2,3,4]; ...
- Jetson TX1使用usb camera采集图像 (1)
使用python实现 https://jkjung-avt.github.io/tx2-camera-with-python/ How to Capture and Display Camera Vi ...
- METO CODE 223 拉力赛
传送门 继续水板子题... #include <bits/stdc++.h> #define ll long long using namespace std; inline int re ...
- 前端知识之jQuery
通过 jQuery,您可以选取(查询,query) HTML 元素,并对它们执行"操作"(actions). http://www.runoob.com/jquery/jquery ...
- Re.FFT
前言 上虽然算是学过了但是实质上还是根本什么都不会 看大佬们的模板去A了模题(手动滑稽) 于是下定决心要理解FFT的代码 一些的证明主要是从算法导论和两位大佬的博客上学的 大佬1 大佬2 在这过程中 ...
- M-BM-
今天拷贝了一段代码 struct Test { Test( int ) {} Test() {} ...
- Luogu3768简单的数学题
题目描述 题解 我们在一通化简上面的式子之后得到了这么个东西. 前面的可以除法分块做,后面的∑T2∑dµ(T/d)是积性函数,可以线性筛. 然后这个数据范围好像不太支持线性筛,所以考虑杜教筛. 后面那 ...