原題傳送門
這是一道很有趣的題目
大家都會非常直覺的想出
表示從第塊玻璃射出的光有多少
表示從第塊玻璃往前面反射回去的光有多少
得到轉移方程
又有
感覺有點奇怪,高斯消元?
不用這麼麻煩,發現我們最重要的是,是沒有用的,嘗試消掉
令
又有
推導
繼續
先把求出來之後
推得答案
Code:
#include <bits/stdc++.h>
#define maxn 500010
#define LL long long
using namespace std;
const LL qy = 1000000007;
int n;
LL a[maxn], b[maxn], f[maxn], F[maxn], G[maxn], inv100;
inline int read(){
int s = 0, w = 1;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
return s * w;
}
LL ksm(LL n, LL k){
if (!k) return 1;
LL sum = ksm(n, k >> 1);
sum = sum * sum % qy;
if (k & 1) sum = sum * n % qy;
return sum;
}
int main(){
n = read(), inv100 = ksm(100, qy - 2);
for (int i = 1; i <= n; ++i) a[i] = read() * inv100 % qy, b[i] = read() * inv100 % qy;
F[n] = a[n], G[n] = b[n];
for (int i = n - 1; i; --i)
F[i] = a[i] * ksm((1LL - b[i] * G[i + 1] % qy + qy) % qy, qy - 2) % qy,
G[i] = (b[i] + a[i] * F[i] % qy * G[i + 1] % qy) % qy;
f[0] = 1;
for (int i = 1; i <= n; ++i) f[i] = F[i] * f[i - 1] % qy;
printf("%lld\n", f[n]);
return 0;
}