HDU 3579 Hello Kiki(中国剩余定理不互质版本)

题目链接

不理解,不明白啊,不互质的时候,思路是两个方程合并成一个,再合并,最后求出结果。。。这个博客讲的不错。

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <map>

 4 #include <cmath>

 5 using namespace std;

 6 #define ll __int64

 7 ll p[11],o[11];

 8 ll x,y;

 9 ll ext_eulid(ll a,ll b)

10 {

11     ll t,d;

12     if(b == 0)

13     {

14         x = 1;

15         y = 0;

16         return a;

17     }

18     d = ext_eulid(b,a%b);

19     t = x;

20     x = y;

21     y = t - (a/b)*y;

22     return d;

23 }

24 ll gcd(ll a,ll b)

25 {

26     return b == 0?a:gcd(b,a%b);

27 }

28 int main()

29 {

30     int t,i,n,z,num = 0;

31     ll p1,o1,d,c,mod;

32     scanf("%d",&t);

33     while(t--)

34     {

35         scanf("%d",&n);

36         for(i = 1;i <= n;i ++)

37         scanf("%I64d",&p[i]);

38         for(i = 1;i <= n;i ++)

39         scanf("%I64d",&o[i]);

40         p1 = p[1];o1 = o[1];

41         z = 1;

42         for(i = 2;i <= n&&z;i ++)

43         {

44            d = ext_eulid(p1,p[i]);

45            c = o[i] - o1;

46            if(c%d) z = 0;//无解的情况

47            mod = p[i]/d;

48            x = ((c/d*x)%mod+mod)%mod;

49            o1 = p1*x + o1;

50            p1 = p1*mod;

51         }

52         if(!z)

53         {

54             printf("Case %d: -1\n",++num);

55             continue;

56         }

57         if(o1 == 0)//这个题目需要特判

58         {

59             o1 = 1;

60             for(i = 1;i <= n;i ++)

61             o1 = o1*p[i]/gcd(o1,p[i]);

62         }

63         printf("Case %d: %I64d\n",++num,o1);

64     }

65     return 0;

66 }

 

你可能感兴趣的:(HDU)