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的主要内容,如果未能解决你的问题,请参考以下文章
JZYZOJ1372 [noi2002]荒岛野人 扩展欧几里得