1. 程式人生 > >【luogu 3811】【模板】乘法逆元

【luogu 3811】【模板】乘法逆元

bottom sel ram font mat 一行 msu set scrip

題目背景

這是一道模板題

題目描述

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

輸入輸出格式

輸入格式:

一行n,p

輸出格式:

n行,第i行表示i在模p意義下的逆元。

輸入輸出樣例

輸入樣例#1:
10 13
輸出樣例#1:
1
7
9
10
8
11
2
5
3
4

說明

1n3×10?6??,n<p<20000528

輸入保證 pp 為質數。

費馬小定理:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4
#include<algorithm> 5 #define ll long long 6 using namespace std; 7 int n,p; 8 int fast(ll a,ll b){ 9 ll ans=1; 10 while(b){ 11 if(b&1)ans=(ans*a)%p; 12 a=(a*a)%p; 13 b>>=1; 14 } 15 return ans; 16 } 17 int main(){ 18 scanf("
%d%d",&n,&p); 19 for(int i=1;i<=n;i++) 20 printf("%d\n",fast(i,p-2)); 21 return 0; 22 }

擴展歐幾裏得:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 void ex_gcd(int a,int b,int
&x,int &y){ 7 if(b==0){x=1,y=0;return;} 8 ex_gcd(b,a%b,x,y); 9 int tmp=x;x=y;y=tmp-(a/b)*y; 10 } 11 int main(){ 12 int a,b,x,y; 13 scanf("%d%d",&a,&b); 14 for(int i=1;i<=a;i++){ 15 ex_gcd(i,b,x,y); 16 printf("%d\n",(x+b)%b); 17 } 18 return 0; 19 }

線性計算:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 int ans[3000010],n,p;
 7 int main(){
 8     scanf("%d%d",&n,&p);
 9     ans[1]=1;puts("1");
10     for(int i=2;i<=n;i++){
11         ans[i]=(long long)(p-p/i)*ans[p%i]%p;
12         printf("%d\n",ans[i]);
13     }
14     return 0;
15 }

【luogu 3811】【模板】乘法逆元