费马小定律求逆元

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
ll n,p,inv[3001000];
ll rd(){
    ll x=0,fl=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')fl=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*fl;
}
/*费马小。会T*/
/*ll ksm(ll x,ll y){
    ll cnt=1;
    while(y){
        if(y&1)cnt=(ll)(cnt*x)%p;
        x=(ll)(x*x)%p;
        y=y>>1;
    }
    return cnt;
}
int main(){
    n=rd();p=rd();
    for(ll i=1;i<=n;i++)
        printf("%lld\n",ksm(i,p-2));
    return 0;
}*/

int main(){
    n=rd();p=rd();
    printf("1\n");inv[1]=1;
    for(int i=2;i<=n;i++){
        inv[i]=(ll)(p-p/i)*inv[p%i]%p;
        printf("%lld\n",inv[i]);
    }
    return 0;
}
/*
详细证明

设t=P/it=P/i
k=P \mod ik=Pmodi
显然有

t*i+k \equiv 0 (\mod P)t∗i+k≡0(modP)
k \equiv -t*i(\mod P)k≡−t∗i(modP)
两侧同除i*ki∗k,并把tt和kk带入

inv[i] \equiv -p/i*inv[p \mod i] (\mod p)inv[i]≡−p/i∗inv[pmodi](modp)
这里需要注意一个事情,

对于 a\mod pamodp当a<0a<0时,

应为(a+p) \mod p(a+p)modp
把原式的\mod pmodp消掉,得

inv[i]=P-P/i*inv[P\mod i]
inv[i]=P−P/i∗inv[Pmodi]
这样就可以进行线性的递推啦
*/

  

原文地址:https://www.cnblogs.com/2017noipak/p/7780350.html