1. 程式人生 > >牛客小白月賽9 A 簽到【逆元】

牛客小白月賽9 A 簽到【逆元】

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld

題目描述 

你在一棟樓房下面,樓房一共有n層,第i層每秒有pi的概率會扔下一個東西並砸到你
求第一秒內你被砸到的概率

輸入描述:

第一行一個整數n
之後有n行,第i+1行有兩個整數ai,bi,表示

輸出描述:

設答案為,你只需要找到一個最小的非負整數T,使得
輸出這個T就行了

示例1

輸入

複製

2
1 2
1 2

輸出

複製

750000006

說明

一共只有如下狀態:

1. 第一層和第二層都扔了下來

2. 第一層扔了下來

3. 第二層扔了下來

4. 第一層和第二層都沒有扔下來

以上四種都是等概率發生的

除了第四種情況外,都會被砸到

因此被砸到的概率是 3/4,這個值在模1e9+7意義下就是750000006

備註:

資料範圍
0 ≤ n ≤ 105
1 ≤ ai ≤ bi ≤ 105

思路:

1-\prod_{i=1}^{n}(1-pi)

逆元處理一下。比賽的時候爆long long了,心塞。。。

程式碼:

#include<bits/stdc++.h>
using namespace std;
#define MAXN 1000005
#define mod 1000000007
#define ll long long
long long quickpow(long long a, long long b) {
    if (b < 0) return 0;
    long long ret = 1;
    a %= mod;
    while(b) {
        if (b & 1) ret = (ret * a) % mod;
        b >>= 1;
        a = (a * a) % mod;
    }
    return ret;
}
long long inv(long long a) {
    return quickpow(a, mod - 2);
}
int n;
int main()
{
    scanf("%d",&n);
    ll ans=1;
    for(int i=0;i<n;i++)
    {
        ll a,b;
        scanf("%lld%lld",&a,&b);
        ans=((ans*(b-a))%mod*inv(b))%mod;
    }
    printf("%lld\n",(mod-ans+1)%mod);
    return 0;
}