[BJOI2019]光线(DP)
2024-08-26 14:14:25
降智了……
当你走头无路的时候就应该知道瞎搞一个DP:
$p[i]$ 表示光射入第 $1$ 块玻璃时,从第 $i$ 块玻璃出去的光量。
$q[i]$ 表示光射入第 $i$ 块玻璃时,从第 $i$ 块玻璃出去的光亮。
为什么是第 $i$ 块呢?因为我们最后只关注 $p[n]$,所以我们关注的反射都是前 $i$ 块射向第 $i+1$ 块(也就是 $q[i]$)和从第 $i+1$ 块射向前 $i$ 块(也就是 $b_{i+1}$)。
初始状态 $p[1]=a_1,q[1]=b_1$。答案为 $p[n]$。
随便画个图得到转移:
$$p[i]=\dfrac{p[i-1]a_i}{1-q[i-1]b_i}$$
$$q[i]=b_i+\dfrac{q[i-1]a_i^2}{1-q[i-1]b_i}$$
时间复杂度 $O(n\log)$。可以做到 $O(n)$,但是懒得写了。
#include<bits/stdc++.h>
using namespace std;
const int maxn=,mod=,inv100=;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int n,a[maxn],b[maxn],f[maxn],g[maxn];
inline int add(int x,int y){return x+y<mod?x+y:x+y-mod;}
inline int sub(int x,int y){return x<y?x-y+mod:x-y;}
inline int mul(int x,int y){return 1ll*x*y%mod;}
inline int qpow(int a,int b){
int ans=;
for(;b;b>>=,a=mul(a,a)) if(b&) ans=mul(ans,a);
return ans;
}
int main(){
n=read();
FOR(i,,n) a[i]=mul(read(),inv100),b[i]=mul(read(),inv100);
f[]=a[];g[]=b[];
FOR(i,,n){
int inv=qpow(sub(,mul(g[i-],b[i])),mod-);
f[i]=mul(mul(f[i-],a[i]),inv);
g[i]=add(b[i],mul(mul(mul(a[i],a[i]),g[i-]),inv));
}
printf("%d\n",f[n]);
}
最新文章
- HTTPS 互联网世界的安全基础
- 使用JHChart勾勒你想要的图表
- nginx的日常应用
- 说说SQL Server 网络配置
- noi 1.5 45:金币
- mac下环境变量、maven3.1.1 及 jdk1.7.0.45配置
- Java.web-application-development-environments-for-macosx
- WWF3状态机工作流<;WWF第七篇>;
- POJ 2386 Lake Counting (水题,DFS)
- 20150515--关于IIS的备忘(WIN7)
- activity工作的使用
- Java笔记原生数据类型【二】
- POJ2151 动态规划
- PL/SQL编程要点和注意点
- Ceph osd启动报错osd init failed (36) File name too long
- svn服务器的搭建与使用一
- npm 模块的总结
- 金融量化之Tushare模块
- linux异步IO的两种方式【转】
- [20190219]那个更快(11g).txt