loj 110 乘法逆元

线性求逆元

1 问题描述

求1到n的所有关于模p的逆元。

2 解析

我们设:

\[p=k*i+r,r\in[0,i-1] \]

于是有:

\[p \equiv 0 (mod \space p) \]

所以:

\[k*i+r \equiv 0(mod \space p) \]

两边同时乘以\(i^{-1}\times r^{-1}\)

\[k*r^{-1}+i^{-1}\equiv 0(mod \space p) \]

所以:

\[i^{-1}\equiv -k*r^{-1}(mod \space p) \]

所以:

\[i^{-1}=-\left \lfloor \frac{p}{i} \right \rfloor * (p \space mod\space i)^{-1}(mod \space p) \]

3 代码

#include<bits/stdc++.h>
using namespace std;  
int mod,n;  
long long inv[3000001];  
int main()
{
    scanf("%d%d",&n,&mod);  
    inv[1]=1;  
   	for(int i=2;i<=n;i++)  
    {
        inv[i]=-(p/i)*inv[p%i]%mod;  
        inv[i]=(inv[i]+mod)%mod;  
    }
    for(int i=1;i<=n;i++) 
        printf("%d\n",inv[i]); 
    return 0; 
}
posted @ 2020-08-20 17:03  zjxxcn  阅读(145)  评论(0编辑  收藏  举报