UVA, 10413 Crazy Savages

题意:给你几个野人,他们住在一个山的环形洞里 他们的初始位置  下一次走几步 几天后消失 求有几个洞他们不会打起来

效果如图:

思路:扩展欧几里得

参考代码:http://blog.csdn.net/pi9nc/article/details/12223357

= =扩展欧几里得我学得真鶸,后面好好弄一下

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 
 6 using namespace std;
 7 
 8 const int N=100;
 9 int c[N],p[N],l[N];
10 int ans;
11 
12 int extend_gcd(int a,int b,int &x,int &y)
13 {
14     if(b==0)
15     {
16         x=1;y=0;
17         return a;
18     }
19     else
20     {
21         int r=extend_gcd(b,a%b,y,x);
22         y-=x*(a/b);
23         return r;
24     }
25 }
26 
27 void datecle()
28 {
29     memset(c,0,sizeof(c));
30     memset(p,0,sizeof(p));
31     memset(l,0,sizeof(l));
32 }
33 
34 void datecin(int n)
35 {
36     datecle();
37     ans=0;
38     for(int i=0;i<n;i++)
39     {
40         scanf("%d%d%d",&c[i],&p[i],&l[i]);
41         ans=max(ans,c[i]);//从最大值算起
42     }
43 }
44 
45 bool datecal(int m,int n)//解方程P*x+m*y=C
46 {
47     for(int i=0;i<n;i++)
48     {
49         for(int j=i+1;j<n;j++)
50         {
51             int x,y;
52             int C=c[i]-c[j];
53             int P=p[j]-p[i];
54             int d=extend_gcd(P,m,x,y);
55             if(C%d)//判断是否有解
56                 continue;
57             x*=C/d;
58             if(d<0) d=-d;
59             x=(x%(m/d)+m/d)%(m/d);//取x最小值
60             if(x<=l[i]&&x<=l[j])
61                 return false;
62         }
63     }
64     return true;
65 }
66 
67 int main()
68 {
69     int t,n;
70     scanf("%d",&t);
71     while(t--)
72     {
73         scanf("%d",&n);
74         datecin(n);
75         while(1)
76         {
77             if(datecal(ans,n))
78                 break;
79             ans++;
80         }
81         printf("%d
",ans);
82     }
83     return 0;
84 }
原文地址:https://www.cnblogs.com/byzsxloli/p/5465431.html