题目背景
这是一道模板题
题目描述
给定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×106,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 ",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 ",(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 ",ans[i]); 13 } 14 return 0; 15 }