解线性同余方程组-模板

 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 }

解出的是最小正整数解

posted @ 2016-06-01 22:59  weeping  阅读(327)  评论(0编辑  收藏  举报