hdu 2891 中国剩余定理

从6点看到10点,硬是没算出来,早知道玩游戏去了,艹,明天继续看

 

不爽,起来再看,终于算是弄懂了,以后超过一个小时的题不会再看了,不是题目看不懂,是水平不够

 

 1 #include<cstdio>
 2 using namespace std;
 3 __int64 result,d;
 4 int flag;
 5 __int64 gcd(__int64 a,__int64 b,__int64 &x,__int64 &y)
 6 {
 7    __int64 t,ret;
 8    if(!b)
 9    {
10      x = 1;
11      y = 0;
12      return a;
13    }
14    ret=gcd(b,a%b,x,y);
15    t=x;
16    x=y;
17    y=t-a/b*y;
18    return ret;
19 }
20 void fun(__int64 a,__int64 b,__int64 n)
21 {
22    __int64 x,y;
23    d=gcd(a,n,x,y);
24    if(b%d!=0)
25     flag =1;
26 result=(x*(b/d)%n+n)%n;
27 }
28 int main()
29 {
30 
31     __int64 a1,m1,a2,m2,t;
32     while(scanf("%I64d",&t)!=EOF)
33     {
34        scanf("%I64d %I64d",&m1,&a1);
35        t--;
36        flag=0;
37        while(t--)
38        {
39         scanf("%I64d %I64d",&m2,&a2);
40         fun(m1,a2-a1,m2);
41         a1+=m1*result;
42         m1=m1*m2/d;
43         a1=(a1%m1+m1)%m1;
44        }
45        if(flag)
46         printf("-1\n");
47        else
48         printf("%I64d\n",a1);
49     }
50     return 0;
51 }

 

posted @ 2015-01-30 20:59  miao_a_miao  阅读(177)  评论(0编辑  收藏  举报