逆元真的难懂
先记录一点此时的心得,日后再来修改
1.除以一个数等于乘这个数的逆元
费马小定律求逆元
证明如下:
费马小定律:假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p)
由费马小定律我们可以想到是不是很像逆元的形式,即:
aa^(p-2)≡1(mod p)*
也就是说a^(p-2)是a的逆元。
即除以a等于乘上a^(p-2)
条件:p是质数,且a不能被p整除!!(费马小定律成立条件),复杂度O(log2§)
#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有一题是kn的阶乘/(k+1),直接算会导致结果有误
用kn的阶乘*ksm(k+1,mod-2)即可