逆元
注意!!!F1只有模数为指数是才能用!!!
1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 using namespace std; 5 typedef long long ll; 6 ll a,b,c,x,y,d; 7 ll fast_pow(ll x,ll n,ll mod){ 8 x%=mod; 9 if(n==1){ 10 return x; 11 } 12 ll s=fast_pow(x,n/2,mod); 13 if(n%2==0){ 14 return s*s%mod; 15 } 16 else{ 17 return s*s%mod*x%mod; 18 } 19 } 20 ll inv_f(ll a,ll n){//F1:费马小定理 21 return fast_pow(a,n-2,n); 22 } 23 ll phi(ll n){ 24 ll sum=n; 25 for(ll i=2;i*i<=n;i++){ 26 if(n%i==0){ 27 sum=sum/i*(i-1); 28 while(n%i==0){ 29 n/=i; 30 } 31 } 32 } 33 if(n!=1){ 34 sum=sum/n*(n-1); 35 } 36 return sum; 37 } 38 ll inv_phi(ll a,ll n){//F2:欧拉定理 39 return fast_pow(a,phi(n)-1,n); 40 } 41 void exgcd(ll a,ll b,ll&d,ll&x,ll&y){ 42 if(!b){ 43 d=a; 44 x=1; 45 y=0; 46 return; 47 } 48 exgcd(b,a%b,d,y,x); 49 y-=x*(a/b); 50 } 51 ll inv_ex(ll a,ll n){//F3:扩展欧几里得 52 exgcd(a,n,d,x,y); 53 return (x%b+b)%b; 54 } 55 int main(){ 56 cin>>a>>b; 57 cout<<inv_f(a,b)<<' '<<inv_phi(a,b)<<' '<<inv_ex(a,b); 58 }
浙公网安备 33010602011771号