逆元的理解

                                                                                            逆元真的难懂
先记录一点此时的心得,日后再来修改

1.除以一个数等于乘这个数的逆元
费马小定律求逆元
证明如下:
费马小定律:假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p)
由费马小定律我们可以想到是不是很像逆元的形式,即:
a*a^(p-2)≡1(mod p)
也就是说a^(p-2)是a的逆元。
即除以a等于乘上a^(p-2)
条件:p是质数,且a不能被p整除!!(费马小定律成立条件),复杂度O(log2(p))

#include<bits/stdc++.h>
#define ll long long
using namespace std;
//前提条件 p是质数,a不能被p整除 
ll ksm(ll a, ll b) {
    ll ans = 1;
    while (b) {
        if (b & 1) {
            ans = ans * a;
            ans = ans % mod;
        }        
        b >>= 1;
        a = a * a;
        a = a % mod;
    }
    return ans;
}
int main(){
    ll a, p;
    while(~scanf("%lld%lld", &a, &p))
    {
        if(a%p==0) 
        printf("-1\n");
        else
        printf("%lld\n", ksm(a,p-2));
    }
}

 

cf有一题是k*n的阶乘/(k+1),直接算会导致结果有误
用k*n的阶乘*ksm(k+1,mod-2)即可

posted @ 2021-10-25 20:10  spzjc  阅读(242)  评论(0)    收藏  举报