1. 程式人生 > >逆元,小白賽9(A.簽到)

逆元,小白賽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
說明
一共只有如下狀態:

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

  2. 第一層扔了下來

  3. 第二層扔了下來

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

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

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

因此被砸到的概率是 3/4,這個值在模1e9+7意義下就是750000006
備註:
資料範圍
0 ≤ n ≤ 105
1 ≤ ai ≤ bi ≤ 105

思路:題目思路不難就是求1-所有事件都不會發生的概率。
然後我們便是求1-i=1n1(ai/bi)\displaystyle\prod_{i=1}^{n}1-( a_i/b_i),其中就涉及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;
}