牛客小白月賽9 A 簽到【逆元】
阿新 • • 發佈:2018-11-19
時間限制: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; }