gcd:
整型求法
int gcd(int x,int y) { return b?gcd(b,a%b):a; }
浮点型求法
1 double gcd(double a,double b) 2 { 3 return a < eqs ? b : gcd(fmod(b,a),a); 4 }
exgcd(摘自:戳这里):
1 typedef long long LL; 2 3 LL exgcd(LL a,LL b,LL &x,LL &y){ 4 5 if(a==0&&b==0) return -1; 6 7 if(b==0) { x=1;y=0; return a; } 8 9 LL d=exgcd(b,a%b,y,x); 10 11 y-=a/b*x; 12 13 return d; 14 15 } 16 17 LL MLE(LL a,LL b,LL mod){ // 返回(a*x)%mod=b 的最小正整数解 18 19 LL x,y; 20 21 LL gcd=exgcd(a,mod,x,y); 22 23 if(b%gcd!=0) return -1; //若返回-1,则该方程无解 24 25 x*=b/gcd; 26 27 mod/=gcd; 28 29 if(mod<0) mod=-mod; 30 31 LL ans=x%mod; 32 33 if(ans<=0) ans+=mod; //其他解为: ans+i*mod (i为整数) 34 35 return ans; 36 37 } 38 39 LL x0,y0,kx,ky; 40 41 bool LE(LL a,LL b,LL c){ //解线性方程ax+by=c 42 43 LL x1,y1; 44 45 LL gcd=exgcd(a,b,x1,y1); 46 47 if(c%gcd)return false; //无整数解 48 49 x0=x1*c/gcd,y0=y1*c/gcd; 50 51 kx=b/gcd,ky=-a/gcd; 52 53 return true; //有解,解集为:(x0+kx*t,y0-ky*t) t为整数 54 55 }