求逆元
Posted loganacmer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求逆元相关的知识,希望对你有一定的参考价值。
逆元
如果b*c mod p等于 1,那么c就叫做b模p的逆元
(a/b) mod p的值等于 a*(b模p的逆元),具体推导可以根据逆元的定义推
这里介绍求逆元的两种方法
费马小定理求逆元
费马小定理:如果a与p互质,那么a^(p-1)模p=1
把这个公式拆开 a*a^(p-2)模p=1,这时a^(p-2)就为逆元
快速幂求a^(p-2)
long long power(long long a,long long p)//求a的p次方 long long base = a,ans = 1; while(p) if(p%2) ans = ans*base%mod; base = base*base%mod; p/=2; return ans;
扩展欧几里得求逆元
扩展欧几里得可以用于求a*x+b*y = c的不定方程,这里把模p看做b,那么逆元就是最后求得的x的值
看一道模板题
你在一栋楼房下面,楼房一共有n层,第i层每秒有pi的概率会扔下一个东西并砸到你
求第一秒内你被砸到的概率(答案模10^9+7)
#include<bits/stdc++.h> #define ll long long #define mod 1000000007 using namespace std; void exgcd(ll a,ll b,ll& x,ll& y) if(b==0) x = 1; y = 0; else exgcd(b,a%b,y,x); y-=x*(a/b); ll ni(ll a,ll b) ll x = 0,y = 0; exgcd(b,mod,x,y); return (a*x%mod+mod)%mod; int main() ll n,up = 1,down = 1,c1,c2; cin>>n; while(n--) scanf("%d%d",&c1,&c2); c1 = c2-c1; up = up*c1%mod; down= down*c2%mod; cout<<ni(down-up,down); return 0;
以上是关于求逆元的主要内容,如果未能解决你的问题,请参考以下文章