版权声明:本文为博主原创文章,未经博主允许不得转载。 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
思路:
逆元处理一下。比赛的时候爆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;
}