首页 > 其他分享 >P5323 [BJOI2019] 光线

P5323 [BJOI2019] 光线

时间:2023-11-06 23:56:14浏览次数:36  
标签:BJOI2019 le P5323 matrix 光线 int times frac mod

P5323 [BJOI2019] 光线

题目描述

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

设对于任意 \(x\),有 \(x \times a_i\%\) 单位的光会穿过它,有 \(x \times b_i\%\) 的会被反射回去。
现在 \(n\) 层玻璃叠在一起,有 \(1\) 单位的光打到第 \(1\) 层玻璃上,那么有多少单位的光能穿过所有 \(n\) 层玻璃呢?

数据范围:
对于 \(5\%\) 的数据,\(n=1\);
对于 \(20\%\) 的数据,\(n\le 2\);
对于 \(30\%\) 的数据,\(n\le 3\);
对于 \(50\%\) 的数据,\(n\le 100\);
对于 \(70\%\) 的数据,\(n\le 3000\);
对于 \(100\%\) 的数据,\(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\) 在满足上述限制的整数中随机生成。

思路:

这个题目我们肯定能够想到一个异常简单的 \(dp\)

令 \(f_i\) 表示从 \(1\rightarrow i\) 透过光的数量,\(g_i\) 表示从 \(i\) 向后然后又回到 \(i\) 的光的数量。
则可以列出转移方程

\[\left\{\begin{matrix} f_i=f_{i-1}\times a_i+g_{i+1}\times b_i\\ g_i=f_{i-1}\times b_i+g_{i+1}\times a_i \end{matrix}\right. \]

然后我们先令 \(i=n\),则

\[\left\{\begin{matrix} f_n=f_{n-1}\times a_n\\ g_n=f_{n-1}\times b_n\\ \end{matrix}\right. \]

再令 \(i=n-1\),则

\[\left\{\begin{matrix} f_{n-1}=f_{n-2}\times a_{n-1}+(f_{n-1}\times b_n)\times b_{n-1}\\ g_{n-1}=f_{n-2}\times b_{n-1}+(f_{n-1}\times b_n)\times a_{n-1} \end{matrix}\right. \]

现在我们尝试化简上述的方程:
令 \(F_i=\frac{f_i}{f_{i-1}},G_i=\frac{g_i}{f_{i-1}}\)
则有:

\[\left\{\begin{matrix} \frac{f_i}{f_{i-1}}=a_i+\frac{g_{i+1}}{f_i}\times b_i ①\\ \frac{g_i}{f_{i-1}}=b_i+\frac{g_{i+1}}{f_i}\times a_i ② \end{matrix}\right. \]

由 ① 得:
\(F_i=a_i+G_{i+1}\times F_i\times b_i\Rightarrow F_i=\frac{a_i}{1-G_{i+1}\times b_i}\)
由 ② 得:
\(G_i=b_i+G_{i+1}\times F_i\times a_i\)

所以:

  • \(F_i=\frac{a_i}{1-G_{i+1}\times b_i}\)
  • \(G_i=b_i+G_{i+1}\times F_i\times a_i\)

然后我们再求原来的 \(f_i\)

\(f_i=f_{i-1}\times F_i\)

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define mem(a) memset(a,0,sizeof(a))
#define set(a,b) memset(a,b,sizeof(a))
#define ls i<<1
#define rs i<<1|1
#define pb push_back
#define pt putchar
#define All(a) a.begin(),a.end()
#define T int t;cin>>t;while(t--)
#define rand RAND
using namespace std;
char buf[1<<20],*p1,*p2;
#define gc()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
template<class Typ> Typ &re(Typ &x){char ch=gc(),sgn=0; x=0;for(;ch<'0'||ch>'9';ch=gc()) sgn|=ch=='-';for(;ch>='0'&&ch<='9';ch=gc()) x=x*10+(ch^48);return sgn&&(x=-x),x;}
template<class Typ> void wt(Typ x){if(x<0) putchar('-'),x=-x;if(x>9) wt(x/10);putchar(x%10^48);}
const int inf=0x3f3f3f3f3f;
const int maxn=5e5+5;
const int mod=1e9+7;
int seed = 19243;
unsigned rand(){return seed=(seed*48271ll)%2147483647;}
int n;
int a[maxn],b[maxn];
int F[maxn],G[maxn];
int f[maxn];
int qp(int x,int k){
    int res=1;
    while(k){
        if(k&1)res=res*x%mod;
        x=x*x%mod;
        k>>=1;
    }
    return res;
}
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i]>>b[i];
    for(int i=1;i<=n;i++)a[i]=a[i]*qp(100,mod-2)%mod,b[i]=b[i]*qp(100,mod-2)%mod;
    F[n]=a[n];
    G[n]=b[n];
    for(int i=n-1;i>=1;i--){
        F[i]=a[i]*qp((1-G[i+1]*b[i]%mod+mod)%mod,mod-2)%mod;
        G[i]=(G[i+1]*F[i]%mod*a[i]%mod+b[i])%mod;
    }
    f[0]=1;
    for(int i=1;i<=n;i++)f[i]=f[i-1]*F[i]%mod;
    cout<<f[n]<<endl;
    return 0;
}

标签:BJOI2019,le,P5323,matrix,光线,int,times,frac,mod
From: https://www.cnblogs.com/Candycar/p/17814073.html

相关文章

  • 在光线追踪中避免自相交的方法
    这是我阅读RayTracingGem的一篇笔记,《避免自相交的快速可靠的方法》是RayTracingGem的第六章。这篇博客文章主要是为了记录和解释原文末尾给出的魔法一般的代码。浮点误差数学上给出了很多不同的求解光线与几何体相交的方法,它们都是等价的,但对于计算机而言并不一定。由......
  • 通过matlab模拟光线在三维空间中的传播路径并根据反射点进行三维空间建模
    1.算法理论概述      光线在三维空间中的传播路径涉及到光学、几何学等多个领域,是计算机图形学和计算机视觉等领域中的重要问题之一。本文将从专业角度详细介绍模拟光线在三维空间中的传播路径,包括多次反射情况,包括实现步骤和数学公式的详细介绍。 一、概述     ......
  • P5319 [BJOI2019] 奥术神杖
    原题虽然不会AC自动机,但这题的前半部分解法让我小小的震撼了由于本人水平有限,所以这里只说前半部分思路我们发现答案\(ans=\sqrt[c]{\prod_{i=1}^{c}{w_i}}\),其中这个\(\sqrt[c]{}\)是很不好算的我们可以把这个柿子写成这个形式:\(ans=(\prod_{i=1}^{c}{w_i})^{\frac{1}{c}}\)......
  • 实时光线追踪(3)Ray Casting
    目录硬件光追(HardwareRayTracing)加速结构(AccelerationStructure,AS)AS策略RayTracingPipelineRayGenerationShaderIntersectionShaderHitShaderRayQuery软件光追(SoftwareRayTracing)ScreenSpaceRayTracingHeightFieldRayTracingVoxelTracingVoxelizationVoxelRa......
  • 洛谷P5322 [BJOI2019] 排兵布阵
    题目大意有s名对手,n座城堡,你有m名士兵如果一名玩家向第\(i\)座城堡派遣的士兵数严格大于对手派遣士兵数的两倍,那么这名玩家就占领了这座城堡,获得\(i\)分。求最大得分数据范围对于\(10\%\)的数据:\(s=1,n\le3,m\le10\)对于\(20\%\)的数据:\(s=1,n\le10,m\le1......
  • P5322 BJOI2019 排兵布阵
    P5322BJOI2019排兵布阵本题主要考察对模型的转化能力。首先要察觉两条性质:对于一个城堡,想打败一个玩家的同时用最少的士兵,肯定是正好派出这个玩家在这个城堡派出的士兵数量的二倍加一名士兵。在一个城堡上,打败了一个在这个城堡派出士兵数量为\(x\)的玩家,就可以顺便打败所......
  • 华为手表开发:WATCH 3 Pro(19)传感器订阅 光线传感器
    华为手表开发:WATCH3Pro(19)传感器订阅光线传感器初环境与设备光线传感器鸿蒙开发文件夹:文件新增展示的文本标记index.hmlindex.cssindex.js初希望能写一些简单的教程和案例分享给需要的人鸿蒙可穿戴开发环境与设备系统:window设备:HUAWEIWATCH3ProNew开发工具:DevEcoStudio3.......
  • 光线追踪加速
    前言​ 若您写过光线追踪会发现光线追踪计算时间是非常非常长的,计算次数=像素数量x三角形面的个数x弹射次数,因此本篇将着重介绍如何对光线追踪进行加速、加速方法......
  • Whitted-Style光线追踪
    前言​ 本篇将介绍什么是光线追踪,为什么需要光线追踪,实现光线追踪的细节,看完本篇即可跟着教程raytracinginoneweekend用c++实现一个简单的光线追踪器,关于该教程笔者也......
  • P5322 [BJOI2019] 排兵布阵
     小C正在玩一款排兵布阵的游戏。在游戏中有nn座城堡,每局对战由两名玩家来争夺这些城堡。每名玩家有m名士兵,可以向第ii座城堡派遣ai名士兵去争夺这个城堡,使得总......