今天我刷题了吗
  • 2U's GitBook
  • 我的模板
    • I/O 及其他
      • 快速读写
      • 关闭同步流
      • 文件重定向
      • 随机数
      • 运行时间
      • Lambda
      • 万能头文件
    • 字符串
      • 字符串分割
      • KMP 算法
      • Manacher 算法
      • AC 自动机
      • 高精度
    • 数学
      • 快速幂
      • 矩阵快速幂
      • 筛法
      • 欧拉函数
      • Polya 定理
      • 逆元
      • 组合数
    • 图论
      • Dijkstra 算法
      • SPFA 算法
      • Kruskal 算法
      • Prim 算法
      • 倍增
      • 离线 Tarjan 算法
      • Tarjan 算法
      • Hungary 算法
      • A* 算法
      • EK 算法
      • Dinic 算法
    • 数据结构
      • 线段树
      • 树状数组
      • 可持久化数组
      • 主席树
      • 树堆
      • 无旋树堆
      • 伸展树
      • 树套树
      • 树链剖分
      • 点分治
      • 动态树
  • 我的题单
由 GitBook 提供支持
在本页

这有帮助吗?

  1. 我的模板
  2. 数学

逆元

扩展欧几里得法求逆元

void exgcd(int a, int b, int& x, int& y)
{
    if (b == 0) {
        x = 1;
        y = 0;
        return;
    }
    exgcd(b, a % b, y, x);
    y -= a / b * x;
}

快速幂法求逆元

因为 ax≡1(modb)ax \equiv 1 \pmod bax≡1(modb) ;

所以 ax≡ab−1(modb)ax \equiv a^{b-1} \pmod bax≡ab−1(modb) (根据 费马小定理 );

所以 x≡ab−2(modb)x \equiv a^{b-2} \pmod bx≡ab−2(modb) 。

线性求逆元

求出 1,2,...,n1,2,...,n1,2,...,n 中每个数关于 ppp 的逆元。

首先,很显然的 1−1≡1(modp)1^{-1} \equiv 1 \pmod p1−1≡1(modp) ;

然后,设 p=ki+j,j<i,1<i<pp=ki+j,j<i,1<i<pp=ki+j,j<i,1<i<p ,再放到 mod  p\mod pmodp 意义下就会得到: ki+j≡0(modp)ki+j \equiv 0 \pmod pki+j≡0(modp) ;

两边同时乘 i−1,j−1i^{-1},j^{-1}i−1,j−1 :

kj−1+i−1≡0(modp)kj^{-1}+i^{-1} \equiv 0 \pmod pkj−1+i−1≡0(modp) ;

i−1≡−kj−1(modp)i^{-1} \equiv -kj^{-1} \pmod pi−1≡−kj−1(modp) ;

i−1≡−(pi)(p mod i)−1i^{-1} \equiv -(\frac{p}{i}) (p \bmod i)^{-1}i−1≡−(ip​)(pmodi)−1 ;

inv[i] = 1;
for (int i = 2; i <= n; i++) {
    inv[i] = (ll)(p - p / i) * inv[p % i] % p;
}
上一页Polya 定理下一页组合数

最后更新于4年前

这有帮助吗?