求x/y%mod

0. 前言

写这个文章是因为遇到一些题,要求解 x / y % m o d x/y\%mod x/y%mod, 其中 m o d = 1 e 9 + 7 mod = 1e9+7 mod=1e9+7, x , y x,y x,y都很大。不能直接求。 当然,第一次总是不会做的, 然后就查资料呗。

1. 逆元定义

我们要求问题 x / y % m o d x/y\%mod x/y%mod, 如果我们找到这样一个数 y ^ \hat{y} y^, 满足 x ∗ y ^ % p = x / y % p x*\hat{y}\%p=x/y\%p xy^%p=x/y%p。 那么, 我们的问题就解决了。 这个 y ^ \hat{y} y^就是 y y y关于 m o d mod mod的逆元。满足定义:
y ∗ y ^ ≡ 1 % p y*\hat{y} \equiv 1 \%p yy^1%p

1.1 用费马小定理求解

另外,还有两种常见的解法是枚举法和拓展欧几里得法,但是不常用。一般都用这个。下面是费马小定理的定义:

  1. 0 < x , y < p 0 < x, y < p 0<x,y<p, p p p是素数。
  2. 如果 a a a, p p p互质,则: a p − 1 ≡ 1 % p a^{p-1} \equiv 1 \% p ap11%p, a ∗ a p − 2 ≡ 1 % p a * a^{p-2} \equiv 1 \% p aap21%p, 这样我们就找到了 a a a关于p的逆元为 a p − 2 a^{p-2} ap2
  3. 那么,我们的问题就解决了, x / y % p = x ∗ y p − 2 % p x/y\%p = x * y^{p-2} \% p x/y%p=xyp2%p
1.2 编程实现
  1. 用快速幂来求 y p − 2 y^{p-2} yp2.
    ll qmi(ll x, ll y){
        if( y == 0) return 1;
        if(y == 1) return x;
        ll ret = qmi(x, y / 2);
        if(y % 2==0) return ret * ret % mod;
        return ret % mod * ret % mod * x % mod;
    }
1.3 例题
  1. Leetcode 1569

3. 扩展

3.1 Lucas 定理

设: n = s ∗ p + q n=s*p+q n=sp+q, m = t ∗ p + r m=t*p+r m=tp+r, ( q , r ≤ p ) (q, r \leq p) (q,rp)。有:
( s p + q t p + r ) ≡ ( s t ) ( q r ) (   m o d   ( p ) ) \left(\begin{array}{l}s p+q \\ t p+r\end{array}\right) \equiv\left(\begin{array}{l}s \\ t\end{array}\right)\left(\begin{array}{l}q \\ r\end{array}\right)(\bmod (p)) (sp+qtp+r)(st)(qr)(mod(p))

3.1.2 Lucas 定理证明

首先你需要这个算式:
( p f ) ≡ 0 (   m o d   ( p ) ) \left(\begin{array}{c}p \\ f\end{array}\right) \equiv 0(\bmod (p)) (pf)0(mod(p))
其中: f > 0 & & f < p >0 \& \& f<p >0&&f<p, 然后
( 1 + x ) n ≡ ( 1 + x ) s p + q ≡ ( ( 1 + x ) p ) s ⋅ ( 1 + x ) q ≡ ( 1 + x p ) s ⋅ ( 1 + x ) q (   m o d   p ) (1+x)^{n} \equiv(1+x)^{s p+q} \equiv\left((1+x)^{p}\right)^{s} \cdot(1+x)^{q} \equiv\left(1+x^{p}\right)^{s} \cdot(1+x)^{q}(\bmod p) (1+x)n(1+x)sp+q((1+x)p)s(1+x)q(1+xp)s(1+x)q(modp)
≡ ∑ i = 0 s ( s i ) ⋅ x i ⋅ p ⋅ ∑ j = 0 q ( q j ) ⋅ x j (   m o d   p ) \equiv \sum_{i=0}^{s}\left(\begin{array}{l}s \\ i\end{array}\right) \cdot x^{i \cdot p} \cdot \sum_{j=0}^{q}\left(\begin{array}{l}q \\ j\end{array}\right) \cdot x^{j} \quad(\bmod p) i=0s(si)xipj=0q(qj)xj(modp)
所以得:
( 1 + x ) s p + q ≡ ∑ i = 0 s ( s i ) ⋅ x i ⋅ p ⋅ ∑ j = 0 q ( q j ) ⋅ x j (   m o d   p ) (1+x)^{s p+q} \equiv \sum_{i=0}^{s}\left(\begin{array}{l}s \\ i\end{array}\right) \cdot x^{i \cdot p} \cdot \sum_{j=0}^{q}\left(\begin{array}{l}q \\ j\end{array}\right) \cdot x^{j}(\bmod p) (1+x)sp+qi=0s(si)xipj=0q(qj)xj(modp)

3.1.3 例题

todo

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值