标签:cin size down == mes 两种 span strong nbsp
逆元
如果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; }
标签:cin size down == mes 两种 span strong nbsp
原文地址:https://www.cnblogs.com/loganacmer/p/11297327.html