hdu1573 中国剩余定理

从爱神那看的中国剩余定理解法,挺容易理解的,就是一个循环迭代更新下去

细节还是很重要!

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define LL long long
 4 void exgcd(LL a,LL b,LL& d,LL &x,LL &y)
 5 {
 6     if (!b) {d=a; x=1; y=0;  }
 7     else {exgcd(b,a%b,d,y,x); y-=x*(a/b);   }
 8 }
 9 int main()
10 {
11     LL T,n,m,i,flag,d,x,y,tmp;
12     LL a[15],b[15];
13     scanf("%I64d",&T);
14     while (T--)
15     {
16         scanf("%I64d%I64d",&n,&m);
17         for (i=1;i<=m;i++) scanf("%I64d",&a[i]);
18         for (i=1;i<=m;i++) scanf("%I64d",&b[i]);
19        flag=0;
20         for (i=2;i<=m;i++)
21         {
22             exgcd(a[1],a[i],d,x,y);
23             if ((b[i]-b[1])%d) {flag=1; break; }//只有差为gcd的倍数才存在解(exgcd)
24             tmp=a[i]/d;//tmp为了防止b[i]-b[1]为负,要把下面的x使变为负
25             x=(x*(b[i]-b[1])/d%tmp+tmp)%tmp;
26             b[1]=a[1]*x+b[1];
27             a[1]=a[1]*a[i]/d;
28         }
29         if (flag||b[1]>n) printf("0\n");
30         else if (b[1]==0) printf("%I64d\n",n/a[1]);//注意余数为0
31         else printf("%I64d\n",(n-b[1])/a[1]+1);
32     }
33 }
View Code

http://acm.hdu.edu.cn/showproblem.php?pid=1573

posted on 2014-11-07 12:13  xiao_xin  阅读(88)  评论(0编辑  收藏  举报

导航