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 }

 

你可能感兴趣的:(HDU)