逆元的理解
逆元真的难懂
先记录一点此时的心得,日后再来修改
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)即可

浙公网安备 33010602011771号