Loj #3093. 「BJOI2019」光线

时间:2022-04-24 09:51:40

Loj #3093. 「BJOI2019」光线

题目描述

当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收。

设对于任意 \(x\),有 \(x\times a_i\%\) 单位的光会穿过它,有 \(x\times b_i\%\) 的会被反射回去。

现在 \(n\) 层玻璃叠在一起,有 \(1\) 单位的光打到第 \(1\) 层玻璃上,那么有多少单位的光能穿过所有 \(n\) 层玻璃呢?

输入格式

第一行一个正整数 \(n\),表示玻璃层数。

接下来 \(n\) 行,每行两个非负整数 \(a_i,b_i\),表示第 \(i\) 层玻璃的透光率和反射率。

输出格式

输出一行一个整数,表示穿透所有玻璃的光对 \(10^9 + 7\) 取模的结果。

可以证明,答案一定为有理数。设答案为 \(a/b\)(\(a\) 和 \(b\) 是互质的正整数),你输出的答案为 \(x\),你需要保证 \(a\equiv bx \pmod {10^9 + 7}\)。

数据范围与提示

对于 \(5\%\) 的数据,保证 \(n=1\)。

对于 \(20\%\) 的数据,保证 \(n\le 2\)。

对于 \(30\%\)的数据,保证 \(n\le 3\)。

对于 \(50\%\) 的数据,保证 \(n\le 100\)。

对于 \(70\%\) 的数据,保证 \(n\le 3000\)。

对于 \(100\%\) 的数据:

- \(1\le n\le 5\times 10^5\)

- \(1\le a_i \le 100\)

- \(0\le b_i \le 99\)

- \(1\le a_i+b_i \le 100\)

- 每组 \(a_i\) 和 \(b_i\) 在满足上述限制的整数中随机生成。

\(\\\)

设\(f_i\)表示一单位光从上至下打到第\(i\)块玻璃之后能穿过第\(n\)块玻璃的单位数量。

\(g_i\)表示一单位光从下至上打到第\(i\)块玻璃之后能穿过第\(n\)块玻璃的单位数量。

特别地\(g_0=0,f_{n+1}=1\)。

于是我们容易得到:

\[f_i=a_i\%f_{i+1}+b_i\%g_{i-1}\ (1\leq i\leq n)\\
\Rightarrow f_{i+1}=\frac{f_i-b_i\%g_{i-1}}{a_i\%}\\
\]

这里不需要考虑\(a_i=0\)的问题,因为\(a_i=0\)时答案为\(0\),特判掉就好了。

以及:

\[g_i=a_i\% *g_{i-1}+b_i\% *f_{i+1}\ (1\leq i\leq n)\\
\]

我们可以设\(f_1=x\),然后按照上面两个\(DP\)出\(f_{n+1}\)用\(x\)表示时的系数。答案就是\(\frac{1}{f_{n+1}}\)。

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 500005 using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;} const ll mod=1e9+7;
ll ksm(ll t,ll x) {
ll ans=1;
for(;x;x>>=1,t=t*t%mod)
if(x&1) ans=ans*t%mod;
return ans;
} int n;
ll a[N],b[N];
const ll inv100=ksm(100,mod-2);
ll f[N],g[N]; int main() {
n=Get();
for(int i=1;i<=n;i++) {
a[i]=inv100*Get()%mod,b[i]=inv100*Get()%mod;
}
for(int i=1;i<=n;i++) {
if(a[i]==0) {cout<<0;return 0;}
}
f[1]=1;
f[2]=ksm(a[1],mod-2);
g[1]=b[1]*f[2]%mod;
for(int i=2;i<=n;i++) {
f[i+1]=(f[i]-b[i]*g[i-1]%mod+mod)*ksm(a[i],mod-2)%mod;
g[i]=(a[i]*g[i-1]+b[i]*f[i+1])%mod;
}
cout<<ksm(f[n+1],mod-2);
return 0;
}

Loj #3093. 「BJOI2019」光线的更多相关文章

  1. LOJ 3093 「BJOI2019」光线——数学&plus;思路

    题目:https://loj.ac/problem/3093 考虑经过种种反射,最终射下去的光线总和.往下的光线就是这个总和 * a[ i ] . 比如只有两层的话,设射到第二层的光线是 lst ,那 ...

  2. LOJ&num;3093&period; 「BJOI2019」光线(递推&plus;概率期望)

    题面 传送门 题解 把\(a_i\)和\(b_i\)都变成小数的形式,记\(f_i\)表示\(1\)单位的光打到第\(i\)个玻璃上,能从第\(n\)个玻璃下面出来的光有多少,记\(g_i\)表示能从 ...

  3. 【LOJ】&num;3093&period; 「BJOI2019」光线

    LOJ#3093. 「BJOI2019」光线 从下到上把两面镜子合成一个 新的镜子是\((\frac{a_{i}a_{i + 1}}{1 - b_{i}b_{i + 1}},b_{i} + \frac ...

  4. Loj &num;3089&period; 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  5. LOJ 3093&colon; 洛谷 P5323&colon; 「BJOI2019」光线

    题目传送门:LOJ #3093. 题意简述: 有 \(n\) 面玻璃,第 \(i\) 面的透光率为 \(a\),反射率为 \(b\). 问把这 \(n\) 面玻璃按顺序叠在一起后,\(n\) 层玻璃的 ...

  6. loj 3090 「BJOI2019」勘破神机 - 数学

    题目传送门 传送门 题目大意 设$F_{n}$表示用$1\times 2$的骨牌填$2\times n$的网格的方案数,设$G_{n}$$表示用$1\times 2$的骨牌填$3\times n$的网 ...

  7. LOJ 3089 「BJOI2019」奥术神杖——AC自动机DP&plus;0&sol;1分数规划

    题目:https://loj.ac/problem/3089 没想到把根号之类的求对数变成算数平均值.写了个只能得15分的暴力. #include<cstdio> #include< ...

  8. LOJ 3094 「BJOI2019」删数——角标偏移的线段树

    题目:https://loj.ac/problem/3094 弱化版是 AGC017C . 用线段树维护那个题里的序列即可. 对应关系大概是: 真实值的范围是 [ 1-m , n+m ] :考虑设偏移 ...

  9. LOJ 3090 「BJOI2019」勘破神机——斯特林数&plus;递推式求通项&plus;扩域

    题目:https://loj.ac/problem/3090 题解:https://www.luogu.org/blog/rqy/solution-p5320 1.用斯特林数把下降幂化为普通的幂次求和 ...

随机推荐

  1. Hibernate 参数设置一览表

    Hibernate 参数设置一览表 属性名 用途 hibernate.dialect 一个Hibernate Dialect类名允许Hibernate针对特定的关系数据库生成优化的SQL. 取值 fu ...

  2. EMV规范 ---ISO7816 T&equals;0协议的时间特性

    复位应答期间: 字符间的时间间隔最小是12etu,最大是9600etu,但整个ATR不得超过19200etu(TS的起始沿到最后一个字符的起始沿 从卡片发出的连续字符其最小时间间隔为12etu,但是终 ...

  3. iOS-SQLite&lpar;FMDB&rpar;

    在已经存在的表中,添加字段,更新表结构 /** Test to see if particular column exists for particular table in database @pa ...

  4. MyBatis框架——关系映射(一对多、多对多、多对一查询)

    关系映射 一.映射(多)对一.(一)对一的关联关系 1).使用列的别名 ①.若不关联数据表,则可以得到关联对象的id属性 ②.若还希望得到关联对象的其它属性.则必须关联其它的数据表 1.创建表: 员工 ...

  5. blog建表操作

    表思维导图:   数据库:表 from django.db import modelsfrom django.conf import settingsfrom django.contrib.auth. ...

  6. 智能化CRM客户关系管理系统介绍一

    智能化CRM客户关系管理系统介绍一 CRM客户关系管理的定义是:企业为提高核心竞争力,利用相应的信息技术以及互联网技术来协调企业与顾客间在销售.营销和服务上的交互,从而提升其管理方式,向客户提供创新式 ...

  7. jdk1&period;8之线程中断

    在Core Java中有这样一句话:"没有任何语言方面的需求要求一个被中断的程序应该终止.中断一个线程只是为了引起该线程的注意,被中断线程可以决定如何应对中断 " 线程中断不会使线 ...

  8. Servlet基本&lowbar;オブジェクトのスコープ

    1.スコープ種類Servletには以下のスコープがあります.Request.Session.Applicationの順にスコープは広くなっていきます.・Applicationスコープ:アプリケーション ...

  9. 一台电脑配置多个tomcat过程

    方法1:https://jingyan.baidu.com/article/76a7e409edbb4dfc3b6e1516.html 方法2:https://www.cnblogs.com/yiyi ...

  10. BZOJ5305 HAOI2018苹果树(概率期望&plus;动态规划)

    每种父亲编号小于儿子编号的有标号二叉树的出现概率是相同的,问题相当于求所有n个点的此种树的所有结点两两距离之和. 设f[n]为答案,g[n]为所有此种树所有结点的深度之和,h[n]为此种树的个数. 枚 ...