1.本菜鸡只会用模板求逆元,逆元是什么我都不知道,上模板:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
/*扩展欧几里得算法
如果a,b互质,则x为a摸b的逆元,即exgcd(a,b)=1;
返回值为a,b的最大共约数
ax+by=exgcd(a,b)
*/
ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){
x=1,y=0;
return a; //到达递归边界返回
}
ll ans=exgcd(b,a%b,x,y),temp=y;
y=x-a/b*y,x=temp; //把x y变成这一层的
return ans;//得到a b的最大公因数
}
//x0+t*b/gcd(a,b) 和 y0-t*a/gcd(a,b) 也是方程 ax+by=gcd(a,b) 的解
/*求最小正整数x,并保证ax+by=c*/
ll cal(ll a,ll b,ll c){
ll x,y,gcd=exgcd(a,b,x,y);
if(c%gcd!=0) return -1;
x*=c/gcd,b/=gcd;
if(b<0) b=-b;
ll inv=x%b;
if(inv<=0) inv+=b;
return inv;
}
int main(){
ll a,b,t;
scanf("%lld",&t);
while(t--){
scanf("%lld%lld",&a,&b);
ll inv=cal(a,b,1);
if(inv==-1) printf("Not Exist\n");
else printf("%lld\n",inv);
}
return 0;
}
/*
逆元的一个重要性质
当p为奇素数,1~p-1的整数模p的所有逆元对应1~p-1中所有的整数, 既是单射也是满射。
比如,当p=7时,1~6模7 对应的逆元分别是 1,4,5,2,3,6
*/
京公网安备 11010502036488号