逆元

注意!!!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 } 

 

posted @ 2023-08-11 23:46  Lemonade~  阅读(14)  评论(0)    收藏  举报