[BJOI2019]光线——递推

题目链接:

[BJOI2019]光线

设$F_{i}$表示从第$1$面玻璃上面向下射入一单位光线,穿过前$i$面玻璃的透光率。

设$G_{i}$表示从第$i$面玻璃下面向上射入一单位光线,穿过前$i$面玻璃的反光率。

那么可以推出:

$F_{i}=F_{i-1}a_{i}\sum\limits_{k=0}^{+\infty}(G_{i-1}b_{i})^k$

$G_{i}=b_{i}+G_{i-1}a_{i}^2\sum\limits_{k=0}^{+\infty}(G_{i-1}b_{i})^k$

后面那部分显然是个等比数列,因为$x<1$,所以$\sum\limits_{k=0}^{+\infty}x^k=\frac{1}{1-x}$。

最后的递推式为:

$F_{i}=\frac{F_{i-1}a_{i}}{1-G_{i-1}b_{i}}$

$G_{i}=b_{i}+\frac{G_{i-1}a_{i}^2}{1-G_{i-1}b_{i}}$

直接递推即可。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int mod=1000000007;
int n,inv;
int a,b; 
int F,G;
int quick(int x,int y)
{
	int res=1;
	while(y)
	{
		if(y&1)
		{
			res=1ll*x*res%mod;
		}
		y>>=1;
		x=1ll*x*x%mod;
	}
	return res;
}
int main()
{
	scanf("%d",&n);
	inv=quick(100,mod-2);
	F=1;
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&a,&b);
		a=1ll*a*inv%mod,b=1ll*b*inv%mod;
		int res=quick((1-1ll*G*b%mod+mod)%mod,mod-2);
		F=1ll*F*a%mod*res%mod;
		G=(b+1ll*a*a%mod*G%mod*res%mod)%mod;
	}
	printf("%d",F);
}

猜你喜欢

转载自www.cnblogs.com/Khada-Jhin/p/10773651.html