牛客小白月赛9 A 签到【逆元】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013852115/article/details/84197915

时间限制: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;
}

猜你喜欢

转载自blog.csdn.net/u013852115/article/details/84197915