1 条题解
-
0
自动搬运
来自洛谷,原作者为

小粉兔
Always continue; Never break;搬运于
2025-08-24 22:09:33,当前版本为作者最后更新于2019-04-22 02:13:00,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
在博客园食用更佳:https://www.cnblogs.com/PinkRabbit/p/BJOI2019D2T2.html
题意简述:
有 面玻璃,第 面的透光率为 ,反射率为 。
问把这 面玻璃按顺序叠在一起后, 层玻璃的透光率。
,。
题解:
题目中告诉我们, 层的玻璃也有透光率,换句话说,多层的玻璃可能可以看作一层。
从这个角度思考,考虑已经求出了前 层玻璃的透光率,如何求出前 层玻璃的透光率。
可以发现已知透光率并不足以进一步求出新的透光率,我们似乎还需要知道反射率。
这时,如果你天真地认为反射率就是从第一面玻璃射入的光的反射率,你就错了。
需要特别注意的是,从第一面和最后一面射入的光的反射率是不相同的。
这是一个很大的坑点,如果注意到了这题就容易了;没注意到就会一直挠头。
总之,我们需要维护两个量:
-
前 面玻璃按顺序叠在一起后,光从第 面玻璃射入时的透光率。
-
前 面玻璃按顺序叠在一起后,光从第 面玻璃射入时的反射率。
分别记为 和 ,则不难推出:
$$\begin{aligned}P_i&=P_{i-1}a_i\sum_{k=0}^{\infty}(Q_{i-1}b_i)^k\\Q_i&=b_i+Q_{i-1}a_i^2\sum_{k=0}^{\infty}(Q_{i-1}b_i)^k\end{aligned} $$其中我们发现带有 的形式,当 时,这个无穷级数等于 。
所以得到最终的递推式:
$$\begin{aligned}P_i&=\frac{P_{i-1}a_i}{1-Q_{i-1}b_i}\\Q_i&=b_i+\frac{Q_{i-1}a_i^2}{1-Q_{i-1}b_i}\end{aligned} $$先算出 可以简化计算。
代码如下:
#include <cstdio> typedef long long LL; const int Mod = 1000000007; const int Inv100 = 570000004; inline LL Inv(LL b) { LL a = 1; for (int e = Mod - 2; e; e >>= 1, b = b * b % Mod) if (e & 1) a = a * b % Mod; return a; } int N; LL P, Q; int main() { scanf("%d", &N); P = 1, Q = 0; while (N--) { LL a, b; scanf("%lld%lld", &a, &b); a = a * Inv100 % Mod, b = b * Inv100 % Mod; LL W = Inv((1 - Q * b % Mod + Mod) % Mod); Q = (b + a * a % Mod * Q % Mod * W) % Mod; P = P * a % Mod * W % Mod; } printf("%lld\n", P); return 0; }题外话:你或许会想,既然反射率不同,透光率是否也不同呢?
然而经过计算,可以得到在每面玻璃两侧的透光率分别相同的情况下,最终两侧的透光率也相同。
这引出了一个有趣的光学原理:可以通过叠加不同的普通玻璃创造出两侧反射率不同的复合玻璃,但是透光率却始终相同。
同时也说明了毛玻璃并不是普通玻璃组合而成的。
-
- 1
信息
- ID
- 4305
- 时间
- 1000ms
- 内存
- 500MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者