求逆元

费马小定理

#include<cstdio>
#include<cstring>
using namespace std;
int Quick_Power(int a,int b,int c)
{
    int ans=1;
    while(b)
    {
        if(b&1)
          ans=(1ll*ans*a)%c;
        a=(1ll*a*a)%c;
        b>>=1;
    }
    return ans;
}
int main()
{
    int a,b,p;
    scanf("%d%d%d",&a,&b,&p);
    b=Quick_Power(b,p-2,p);
    printf("%d",((a%p)*(b%p))%p);
    return 0;
}

扩展欧几里得

#include<bits/stdc++.h>
using namespace std;
typedef  long long ll;
void extgcd(ll a,ll b,ll& d,ll& x,ll& y){
    if(!b){ d=a; x=1; y=0;}
    else{ extgcd(b,a%b,d,y,x); y-=x*(a/b); }
}
ll inverse(ll a,ll n){
    ll d,x,y;
    extgcd(a,n,d,x,y);
    return d==1?(x+n)%n:-1;
}
int main(){
    ll a,m;
    cin>>a>>m;
    cout<<inverse(a,m);
}

筛法

#include<cstdio>
#include<cstring>
#define N 1000005
using namespace std;
int inv[N];
void get_inverse(int n,int p)
{
    int i;
    inv[1]=1;
    for(i=2;i<=n;++i)
      inv[i]=(p-p/i)*inv[p%i]%p;
}
int main()
{
    int n,i,p;
    scanf("%d%d",&n,&p);
    get_inverse(n,p);
    return 0;
}
rush!
原文地址:https://www.cnblogs.com/LH2000/p/13782463.html