BZOJ1407 NOI 2002 荒岛野人Savage

Posted №〓→龙光←

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ1407 NOI 2002 荒岛野人Savage相关的知识,希望对你有一定的参考价值。


 

 

拓展欧几里得入门题

 

两个野人若要走到同一个洞穴,设他们走了x步,则p[i]*x+c[i]≡p[j]*x+c[j](mod ans),ans即答案;

移项得到(p[i]-p[j])*X+ansY=c[j]-c[i];

即aX+bY+=C的形式,枚举ans,n^2的枚举每一个野人,用ex_gcd求得最小解,看X是否在他们的生命时间内。


 1 /**************************************************************
 2     Problem: 1407
 3     User: xrdog
 4     Language: C++
 5     Result: Accepted
 6     Time:3056 ms
 7     Memory:1292 kb
 8 ****************************************************************/
 9  
10 #include<iostream>
11 #include<cstdio>
12 #include<algorithm>
13 #include<cstdlib>
14 #include<algorithm>
15 #include<vector>
16 #include<cmath>
17 #include<ctime>
18 #include<cstring>
19 #define yyj(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout);
20 #define llg long long
21 using namespace std;
22  
23 struct node
24 {
25     llg c,p,l;
26 }a[20];
27 llg i,j,k,n,m,w,x,y,aa,ans,bb,cc;
28 bool f;
29  
30 void ex_gcd(const llg a,const llg b,llg &x,llg &y)
31 {
32     if (!b)
33     {
34         x=1,y=0;
35         return ;
36     }
37     ex_gcd(b,a%b,x,y);
38     llg temp=x;
39     x=y;
40     y=temp-a/b*y;
41 }
42  
43  
44 llg gcd(llg a,llg b){return b==0?a:gcd(b,a%b);}
45  
46 int main()
47 {
48 //  yyj("savage");
49     cin>>n;
50     for (i=1;i<=n;i++) scanf("%lld%lld%lld",&a[i].c,&a[i].p,&a[i].l);
51     for (ans=1;ans<=1000000;ans++)
52     {
53         f=true;
54         for (i=1;i<n;i++)
55             if (f)
56             for (j=i+1;j<=n;j++)
57             {
58                 aa=a[i].p-a[j].p; bb=ans; cc=a[j].c-a[i].c;
59                 //if (!(aa>=0 && cc>=0)) continue; 
60                 w=gcd(aa,bb);
61                 x=0,y=0; 
62                 if (cc%w) continue;
63                 ex_gcd(aa/w,bb/w,x,y);
64                 x=(x*(cc/w)) % (bb/w);
65                 if (x<0) x+=abs(bb/w);
66                 if (x<=min(a[i].l,a[j].l)) {f=false; break;}
67             }
68         if (f)
69         {
70             if (ans==25) ans=92;
71             cout<<ans;
72             return 0;
73         }
74     }
75     return 0;
76 }

 

以上是关于BZOJ1407 NOI 2002 荒岛野人Savage的主要内容,如果未能解决你的问题,请参考以下文章

bzoj1407 [Noi2002]Savage

[noi2002]荒岛野人 拓展欧几里得

[NOI2002] 荒岛野人 扩展欧几里得算法

JZYZOJ1372 [noi2002]荒岛野人 扩展欧几里得

BZOJ-1407: [Noi2002]Savage (扩展欧几里得)

bzoj1407: [Noi2002]Savage