luogu P5323 [BJOI2019]光线
先考虑\(n=1\)的情况不是输入数据都告诉你了吗
然后考虑\(n=2\),可是光线是在弹来弹去的废话,然后射出去的光线是个等比数列求和的形式,也就是\(x_1\sum_{i=1}^{\infty} d^i=x_1\frac{1}{1-d}\),然后弹回去的光线第一个光线就是\(b_i\),然后后面也是等比数列求和,算一下就好了
\(n>2\),我们做完\(n-1\)后,可以把刚刚算过的玻璃看成一块,因为已经知道会射出去多少以及弹回去多少,然后就变成了\(n=2\),那么递推做即可
我写的是倒推,好像顺推也可以qwq
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<cmath>
#include<ctime>
#include<queue>
#include<map>
#include<set>
#define LL long long
#define db double
using namespace std;
const int N=5e5+10,mod=1e9+7,pc=570000004;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int fpow(int a,int b){int an=1;while(b){if(b&1) an=1ll*an*a%mod;a=1ll*a*a%mod,b>>=1;} return an;}
int inv(int a){return fpow(a,mod-2);}
int n,a[N],b[N],f[2],g[2];
int main()
{
n=rd();
for(int i=1;i<=n;++i) a[i]=1ll*rd()*pc%mod,b[i]=1ll*rd()*pc%mod;
int nw=1,la=0;
f[la]=a[n],g[la]=b[n];
for(int i=n-1;i;--i)
{
g[nw]=b[i];
int lt=a[i],s1,s2,t1,t2,dd;
s1=1ll*lt*f[la]%mod,lt=1ll*lt*g[la]%mod;
t1=1ll*lt*a[i]%mod,lt=1ll*lt*b[i]%mod;
s2=1ll*lt*f[la]%mod,lt=1ll*lt*g[la]%mod;
t2=1ll*lt*a[i]%mod;
dd=1ll*s2*inv(s1)%mod,f[nw]=1ll*s1*inv(mod+1-dd)%mod;
dd=1ll*t2*inv(t1)%mod,g[nw]=(g[nw]+1ll*t1*inv(mod+1-dd))%mod;
nw^=1,la^=1;
}
printf("%d\n",f[la]);
return 0;
}
luogu P5323 [BJOI2019]光线的更多相关文章
- [洛谷P5323][BJOI2019]光线
题目大意:有$n$层玻璃,每层玻璃会让$a\%$的光通过,并把$b\%$的光反射.有一束光从左向右射过,问多少的光可以透过这$n$层玻璃 题解:事实上会发现,可以把连续的几层玻璃合成一层玻璃,但是要注 ...
- [BJOI2019]光线(递推)
[BJOI2019]光线(递推) 题面 洛谷 题解 假装玻璃可以合并,假设前面若干玻璃的透光率是\(A\),从最底下射进去的反光率是\(B\),当前的玻璃的透光率和反光率是\(a,b\). 那么可以得 ...
- [BJOI2019]光线——递推
题目链接: [BJOI2019]光线 设$F_{i}$表示从第$1$面玻璃上面向下射入一单位光线,穿过前$i$面玻璃的透光率. 设$G_{i}$表示从第$i$面玻璃下面向上射入一单位光线,穿过前$i$ ...
- [BJOI2019]光线[递推]
题意 题目链接 分析 令 \(f_i\) 表示光线第一次从第一块玻璃射出第 \(i\) 块玻璃的比率. 令 \(g_i\) 表示光线射回第 \(i\) 块玻璃,再射出第 \(i\) 块玻璃的比率. 容 ...
- [BJOI2019] 光线
看起来很麻烦,做起来并不难的题 以下设:$a_i=\frac{a_i}{100},b_i=\frac{b_i}{100}$ 显然,如果$b_i=0$的话,直接求$\Pi a_i$就是答案. 解决反射问 ...
- luogu P5324 [BJOI2019]删数
传送门 不如先考虑暴力,能删的序列首先有\(1,2,3...n\),还有就是升序排序后从后往前放数,第\(i\)位要么放\(i\),要么放\(i+1\)位置的数,例如\(1,2,4,4,5,6,9,9 ...
- luogu P5322 [BJOI2019]排兵布阵
传送门 普及dp 设\(f_{i,j}\)表示前\(i\)个城堡,用\(j\)人的最大价值,转移枚举一个对手,如果这个对手在\(i\)这个城堡人数是第\(k\)小的,那么用\(2a_i+1\)人可以得 ...
- luogu P5320 [BJOI2019]勘破神机
传送门 首先我们要知道要求什么.显然每次放方块要放一大段不能从中间分开的部分.设\(m=2\)方案为\(f\),\(m=3\)方案为\(g\),\(m=2\)可以放一个竖的,或者两个横的,所以\(f_ ...
- luogu P5319 [BJOI2019]奥术神杖
传送门 要求的东西带个根号,这玩意叫几何平均数,说到平均数,我们就能想到算术平均数(就是一般意义下的平均数),而这个东西是一堆数之积开根号,所以如果每个数取对数,那么乘法会变成加法,开根号变成除法,所 ...
随机推荐
- 电脑开机后win系统运行异常慢,鼠标移动卡
今天公司里面一个小伙伴的电脑开机后还没有打开应用程序系统就运行非常慢,打开文件夹反应慢,鼠标是一点一点的在移动.体验感极差.作为运维的我立即上去解决问题: 首先是查看一下电脑确实运行比较慢,然后就查看 ...
- MyBatis学习日记(三):戏说MyBatis配置文件
properties标签 properties标签可以用来加载别的配置文件,比如可以加载数据库的配置文件,jdbc.properties. 下面是jdbc.properties jdbc.driver ...
- MySQL 系列
阅读目录 第一篇:初识数据库 第二篇:库操作相关 第三篇:表相关操作 第四篇:记录相关操作 第五篇:数据备份.pymysql模块 第六篇:视图.触发器.事务.存储过程.函数 第七篇:ORM框架SQLA ...
- 为什么要花钱学 Python,自学不好吗?
买了这么多课程,有哪一门是你从头到尾听完,并且能将知识点学以致用的?如果你想成为一名相对优秀的程序员,建议你读完这篇文章,如果愿意可以分享给你的朋友. 2018过去的一年,对大多数互联网人来说,201 ...
- codeforces#1152C. Neko does Maths(最小公倍数)
题目链接: http://codeforces.com/contest/1152/problem/C 题意: 给出两个数$a$和$b$ 找一个$k(k\geq 0)$得到最小的$LCM(a+k,b+k ...
- jQuery手机端点击弹出分享按钮代码
一.HTML代码如下: <span onClick="toshare()" style="border:dotted 1px #ddd;display:block; ...
- vscode 打开多个标签页
默认只打开2个,按如下设置可以支持多开: 路径C:\Users\admin\AppData\Roaming\Code\User下的settings.json添加一条配置:"workbench ...
- (八)jdk8学习心得之Optional类
八.Optional 类 1. 作用:可以存放空指针null,主要用于解决空指针问题. 2. 使用方法 1) 创建对象(2种方法) Optional optional = Optional.of(非n ...
- 题解 P2763 【试题库问题】
这题可以用网络流,但我用的是匈牙利算法 进入正题 设第个类型需要个.将每个类型拆成个点,用一个边集数组记录它拆成的点. 第个试题有个类型,分别将与拆成的点连边,这样便构成了一个二分图. 使用匈牙利算法 ...
- JDK 新特性
Jdk8新特性 一:接口默认方法和静态方法: 我们可以在接口中定义默认方法,使用default关键字,并提供默认的实现.所有实现这个接口的类都会接受默认方法的实现,除非子类提供的自己的实现. 我们还可 ...