逆元,小白赛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的逆元啦。
所以我们用快速幂求就行了

链接:https://ac.nowcoder.com/acm/contest/275/A
来源:牛客网

你在一栋楼房下面,楼房一共有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 = 1 n 1 ( a i / b i ) \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;
}

猜你喜欢

转载自blog.csdn.net/starmoth/article/details/84196396