题解-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 ...
随机推荐
- Springcloud zuul和shiro结合
一.目标1.外部请求统一从网关zuul进入,并且服务内部互相调用接口要校验权限 2.cloud和shiro结合,达到单点登录,和集中一个服务完成权限管理,其他业务服务不需要关注权限如何实现 3.其他服 ...
- Photoshop入门教程图解版
- feilong's blog | 目录
每次把新博客的链接分享到技术群里,我常常会附带一句:蚂蚁搬家.事实上也确实如此,坚持1篇1篇的把自己做过.思考过.阅读过.使用过的技术和教育相关的知识.方法.随笔.索引记录下来,并持续去改进它们,希望 ...
- kettle变量(var变量)
设置变量/set varibale 1.定义变量(子转换): 原始数据 设置获取变量:点击获取字段,自动获取变量名称和字段名称 引用变量: 输出: kettle.properties 文件存储在.ke ...
- DAY25、面向对象总复习
面向对象总复习:面向过程编程思想: 核心是 过程 二字, 过程指的是解决问题的步骤是,即先干什么再干什么. 基于该编程思想编写程序,相当于一条流水线,一种机械式的思维方式. 面向对象编程思想: 核心是 ...
- PHP——??空合并运算符和?:三元运算符
前言 在上一篇随笔,用三元运算符简单写的一个东西,引发了对他的兴趣,所以打算研究下. PHP7的新特性: https://php.net/manual/zh/migration70.new-featu ...
- leanote折腾指南
持续更新. 过几天把自己的修改好的css放到github上给大家参考. https://github.com/whuwangyong/leanote-conf TODO leanote Linux/W ...
- centos7升级内核至最新
应用背景: 最近在接触docker,其对内核版本要求较高,就连目前使用的centos7.x默认内核版本为3.10.0-xxx,也是刚好满足其最低要求,故借此机会记录一下升级内核的操作步骤. 测试环境: ...
- CF235B Let's Play Osu! 期望DP
貌似是一道很裸的期望\(DP\).直接说思路: 设\(f[i]\)表示到\(i\)位置时的期望分数,但是只有\(f[i]\)的话我们发现是无法转移的,我们还需要知道到\(i\)位置时的期望连续长度,于 ...
- 实验一 Java开发环境的熟悉(Linux + Eclipse)
学号 20175206 实验一 <Java开发环境的熟悉>实验报告 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实 ...