逆元用在哪呢?比如说(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
说明
一共只有如下状态:
-
第一层和第二层都扔了下来
-
第一层扔了下来
-
第二层扔了下来
-
第一层和第二层都没有扔下来
以上四种都是等概率发生的
除了第四种情况外,都会被砸到
因此被砸到的概率是 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;
}