费马小定律求逆元
#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] 这样就可以进行线性的递推啦 */