乘法逆元
若整数
b
b
b,
m
m
m互质, 并且
b
∣
a
b|a
b∣a,则存在一个整数
x
x
x,使得
a
/
b
≡
a
∗
x
(
m
o
d
m
)
a/b \equiv a * x(mod \ m)
a/b≡a∗x(mod m)。称x为b的模m的乘法逆元,记为
b
−
1
(
m
o
d
m
)
b^{-1}(mod \ m)
b−1(mod m)。
因为
a
/
b
≡
a
∗
b
−
1
≡
a
/
b
∗
b
∗
b
−
1
(
m
o
d
m
)
a/b \equiv a * b^{-1}\equiv \ a/b * b*b^{-1}(mod \ m)
a/b≡a∗b−1≡ a/b∗b∗b−1(mod m)。
如果p是质数,根据费马小定理
b
p
−
1
≡
1
(
m
o
d
p
)
b^{p-1} \equiv1(mod \ p)
bp−1≡1(mod p),既
b
∗
b
p
−
2
≡
1
(
m
o
d
p
)
b*b^{p-2} \equiv1(mod \ p)
b∗bp−2≡1(mod p),因此,当
p
p
p为质数时,
p
p
p的乘法逆元为
b
p
−
2
b^{p-2}
bp−2。
例题
添加链接描述
思路
求抽到想要的卡的概率,直接先求出全部抽完都没有想要的卡的概率,然后用1减去这个概率就可以了。
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 1e6+5;
const ll mod = 1e9+7;
ll n, a[N], b[N], ans = 1;
ll power(ll a, ll b)
{
ll ans = 1 % mod;
for(; b; b >>= 1)
{
if(b&1)
ans = (ll) ans * a % mod;
a = (ll) a * a % mod;
}
return ans;
}
ll inv(ll x) //乘法逆元
{
return power(x, mod-2);
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i];
for(int i = 1; i <= n; i++)
cin >> b[i];
for(int i = 1; i <= n; i++)
ans = ans * (a[i] - b[i]) % mod * inv(a[i]) % mod;
cout << (mod+(1-ans)) % mod << endl;
return 0;
}