1. 程式人生 > >模板【洛谷P3811】 【模板】乘法逆元

模板【洛谷P3811】 【模板】乘法逆元

puts amp ace char pri while iostream lld [1]

P3811 【模板】乘法逆元

給定n,p求1~n中所有整數在模p意義下的乘法逆元。

T兩個點的費馬小定理求法:

code:

#include <iostream>
#include <cstdio>

using namespace std;

#define int long long

int n,mod;

inline int read(){
    int sum=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0'; ch=getchar();}
    return sum*f;
}

int ksm(int a,int b){
    int re=1;
    while(b){
        if(b&1)re=re*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return re;
}

signed main(){
    n=read(); mod=read();
    for(int i=1;i<=n;i++){
        printf("%lld\n",ksm(i,mod-2));
    }
}

線性求逆元式子:

inv[i]=(mod-mod/i)*inv[mod%i]%mod

code:

#include <iostream>
#include <cstdio>

using namespace std;

#define int long long

int n,mod;

inline int read(){
    int sum=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0'; ch=getchar();}
    return sum*f;
}

int inv[3000017];

signed main(){
    n=read(); mod=read();inv[1]=1;puts("1");
    for(int i=2;i<=n;i++){
        printf("%lld\n",inv[i]=(mod-mod/i)*inv[mod%i]%mod);
    }
}

模板【洛谷P3811】 【模板】乘法逆元