zoukankan      html  css  js  c++  java
  • 费马小定律求逆元

    #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]
    这样就可以进行线性的递推啦
    */

      

  • 相关阅读:
    linux--menuconfig
    linux--rcs
    linux--VSS/RSS/PSS/USS
    vi编辑器中发现文件中每行都有一个^M字符
    linux umount命令
    Linux mount命令
    Linux rmmod命令
    Linux lsmod命令
    Linux insmod命令
    linux--cpio文件
  • 原文地址:https://www.cnblogs.com/2017noipak/p/7780350.html
Copyright © 2011-2022 走看看