题目描述
给定n,p求1~n中所有整数在模p意义下的乘法逆元。
输入输出格式
输入格式:
一行n,p
输出格式:
n行,第i行表示i在模p意义下的逆元。
扩欧求解同余方程
#include<bits/stdc++.h> using namespace std; #define ll long long ll int n,p,x,y; void gcd(ll a,ll b,ll &x,ll &y) { if(!b){x=1;y=0;} else gcd(b,a%b,y,x),y-=(a/b)*x; } int main() { cin>>n>>p; for(int i=1;i<=n;i++) { gcd(i,p,x,y); cout<<(x%p+p)%p<<endl; } }
费马小定理
#include<bits/stdc++.h> using namespace std; #define ll long long ll int n,p,x,y; long long int power(int b,int k) { if(!k)return 1; else{ long long a=power(b,k/2); if(!(k%2))return (a*a)%p; else return (a*a*b)%p; } } int main() { cin>>n>>p; for(int i=1;i<=n;i++) { ll ans=power(i,p-2); cout<<(ans%p+p)%p<<endl; } }
递推
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=3e6+5; ll inv[maxn]={0,1}; int main(){ int n,p; scanf("%d%d",&n,&p); printf("1 "); for(int i=2;i<=n;i++) inv[i]=(ll)p-(p/i)*inv[p%i]%p,printf("%d ",inv[i]); }