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);
    }
  • 相关阅读:
    jq---方法总结
    Coderfroces 862 B . Mahmoud and Ehab and the bipartiteness
    Coin
    joisino's travel
    日天的终生大事(dp)
    Codefroces 852 G. Bathroom terminal
    Codefroces432 div2 A,B,C
    Atcoder ABC 069 C
    Codefroces 849 A,B
    HDU 6186 CS Course
  • 原文地址:https://www.cnblogs.com/Khada-Jhin/p/10773651.html
Copyright © 2011-2022 走看看