解线性同余方程组-模板
1 int n; 2 LL a[K],b[K]; 3 LL gcd(LL a,LL b) 4 { 5 return b==0?a:gcd(b,a%b); 6 } 7 void exgcd(LL a,LL b,LL &d,LL &x,LL &y) 8 { 9 if(b==0) 10 { 11 x=1;y=0;d=a; 12 return; 13 } 14 exgcd(b,a%b,d,y,x); 15 y-=x*(a/b); 16 } 17 LL slove(void)//x=b[i](mod a[i]) 18 { 19 LL ta=a[0],tb=b[0]; 20 bool flag=true; 21 for(int i=1;i<n;i++) 22 { 23 LL xa=ta,xb=a[i],c=b[i]-tb,d,x,y; 24 exgcd(xa,xb,d,x,y); 25 if(c%d) 26 { 27 flag=false;break; 28 } 29 LL tm=xb/d; 30 x=(x*(c/d)%tm+tm)%tm; 31 tb=ta*x+tb; 32 ta=ta/d*a[i]; 33 } 34 if(!flag) 35 return -1; 36 return tb; 37 }
解出的是最小正整数解
作者:weeping
出处:www.cnblogs.com/weeping/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。