【luogu 3811】【模板】乘法逆元
阿新 • • 發佈:2017-10-10
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
說明
1≤n≤3×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】【模板】乘法逆元