zoukankan      html  css  js  c++  java
  • [BJOI2019]光线——递推

    题目链接:

    [BJOI2019]光线

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

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

    那么可以推出:

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

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

    后面那部分显然是个等比数列,因为$x<1$,所以$sumlimits_{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);
    }
  • 相关阅读:
    POJ3320 Jessica's Reading Problem
    POJ3320 Jessica's Reading Problem
    CodeForces 813B The Golden Age
    CodeForces 813B The Golden Age
    An impassioned circulation of affection CodeForces
    An impassioned circulation of affection CodeForces
    Codeforces Round #444 (Div. 2) B. Cubes for Masha
    2013=7=21 进制转换
    2013=7=15
    2013=7=14
  • 原文地址:https://www.cnblogs.com/Khada-Jhin/p/10773651.html
Copyright © 2011-2022 走看看