题解 P5323 【[BJOI2019]光线】
justin_cao · · 题解
来提供一个似乎题解里面还没有的做法。
首先考虑设
然后发现有在第
考虑再设一个
考虑转移:
首先
然后
显然
这样就做完了,复杂度
实际上推完式子可以发现,
code:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<bitset>
#define eps 1e-15
#define maxn 500010
#define maxm 410
#define inf 999999999999999
#define mod 1000000007
#define mp(x,y) make_pair(x,y)
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef pair<int,int>pii;
int read()
{
int x=0,f=1;
char ch=getchar();
while(ch-'0'<0||ch-'0'>9){if(ch=='-') f=-1;ch=getchar();}
while(ch-'0'>=0&&ch-'0'<=9){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n;
int quick_pow(int x,int p)
{
int an=1,po=x;
while(p)
{
if(p&1) an=1ll*an*po%mod;
po=1ll*po*po%mod;
p>>=1;
}
return an;
}
int a[maxn],b[maxn];
int f[maxn],g[maxn];
int main()
{
n=read();
int INV=quick_pow(100,mod-2);
for(int i=1;i<=n;i++) a[i]=1ll*read()*INV%mod,b[i]=1ll*read()*INV%mod;
f[1]=a[1];g[1]=b[1];
for(int i=2;i<=n;i++)
{
int tmp=(mod+1-1ll*b[i]*g[i-1]%mod+mod)%mod;
tmp=quick_pow(tmp,mod-2);f[i]=1ll*tmp*a[i]%mod;
g[i]=(b[i]+1ll*g[i-1]*a[i]%mod*f[i]%mod)%mod;
}
int ans=1;
for(int i=1;i<=n;i++) ans=1ll*ans*f[i]%mod;
cout<<ans<<endl;
return 0;
}