逆元,小白賽9(A.簽到)
逆元用在哪呢?比如說(a/b)%p。此時b過大,我們就要把除法變為乘法,就是找一個特殊的數乘上這個特殊的數就能起到除法的效果。例如T≡(a/b)(mod p)。即我們要找到的是b的逆元(如果看不懂我一步一步解釋)
先說下整除的概念:如果a被b整除,即a是b的倍數,那麼我們寫成b|a
然後是同餘的概念:若給定正整數p,整數a,b。如果滿足p|(a-b)我們就稱a與b對模p同餘記為a≡b(mod p).
最後說下費馬小定律求逆元:在是素數的情況下,對任意整數都有。
如果無法被整除,則有。
可以在為素數的情況下求出一個數的逆元,,即為逆元。
題目中的資料範圍1<=x<=10^9,p=1000000007,p是素數;
所以x肯定就無法被p整除啊,所以最後就得出x^(p-2)為x的逆元啦。
所以我們用快速冪求就行了
你在一棟樓房下面,樓房一共有n層,第i層每秒有pi的概率會扔下一個東西並砸到你
求第一秒內你被砸到的概率
輸入描述:
第一行一個整數n
之後有n行,第i+1行有兩個整數ai,bi,表示
輸出描述:
設答案為,你只需要找到一個最小的非負整數T,使得
輸出這個T就行了
示例1
輸入
複製
2
1 2
1 2
輸出
複製
750000006
說明
一共只有如下狀態:
-
第一層和第二層都扔了下來
-
第一層扔了下來
-
第二層扔了下來
-
第一層和第二層都沒有扔下來
以上四種都是等概率發生的
除了第四種情況外,都會被砸到
因此被砸到的概率是 3/4,這個值在模1e9+7意義下就是750000006
備註:
資料範圍
0 ≤ n ≤ 105
1 ≤ ai ≤ bi ≤ 105
思路:題目思路不難就是求1-所有事件都不會發生的概率。
然後我們便是求1-,其中就涉及a/b%p的過程,b過大,我們就只能把除轉化為乘,就是求逆元的過程。
#include <iostream> #include <string.h> #include <stdlib.h> #include <stdio.h> using namespace std; const int p=1e9+7; typedef long long LL; LL quick_exp(LL a, LL n) { LL ans = 1,r=a%p; while(n) { if(n & 1) ans = (ans * a) % p; a = (a * a) %p; n >>= 1; } return ans; } int main() { int t; LL a=1,b=1; LL a1,b1; scanf("%d",&t); for(int i=0; i<t; i++) { scanf("%lld%lld", &a1, &b1); a=a*(b1-a1)%p; b=b*b1%p; } a=(b-a+p)%p; printf("%lld\n",a*quick_exp(b,p-2)%p); return 0; }