ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

O(n)递推求乘法逆元

2021-09-21 21:33:10  阅读:158  来源: 互联网

标签:10 int pmod 逆元 推求 乘法 equiv


题目链接

P3811 【模板】乘法逆元


题目描述

给定 \(n,p\), 求 \(1\sim n\) 中所有整数在模 \(p\) 意义下的乘法逆元。

输入格式

一行两个正整数 \(n,p\)。

输出格式

输出 \(n\) 行,第 \(i\) 行表示 \(i\) 在模 \(p\) 下的乘法逆元。

输入

10 13

输出

1
7
9
10
8
11
2
5
3
4

说明/提示

\(1 \leq n \leq 3 \times 10 ^ 6, n < p < 20000528\)
输入保证 \(p\) 为质数。

解题思路

  1. \(1^{−1}≡1(mod\,p)\)
  2. 设 \(p=k\times i +r,(1<r<i<p)\), \(k\) 是 \(p / i\) 的商,\(r\) 是余数,则:

\[k\times i+r≡0(mod\,p) \]

然后乘上\(i^{-1} ,r^{-1}\) 就可以得到:

\[k*r^{-1}+i^{-1}\equiv 0 \pmod p \]

\[i^{-1}\equiv -k*r^{-1} \pmod p \]

\[i^{-1}\equiv -\lfloor \frac{p}{i} \rfloor*(p \bmod i)^{-1} \pmod p \]

可以发现,这是个递推式~

  • 时间复杂度:\(O(n)\)

代码

#include<bits/stdc++.h>
using namespace std;
const int N=3e6+10;
int inv[N];
int n,p;
int main()
{
    scanf("%d%d",&n,&p);
    inv[1]=1;
    puts("1");
    for(int i=2;i<=n;i++)
    {
        inv[i]=1ll*(-p/i+p)*inv[p%i]%p;
        printf("%d\n",inv[i]);
    }
    return 0;
}

标签:10,int,pmod,逆元,推求,乘法,equiv
来源: https://www.cnblogs.com/zyyun/p/15317907.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有