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 */