1. 程式人生 > 其它 >逆元的理解

逆元的理解

逆元真的難懂
先記錄一點此時的心得,日後再來修改

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)即可