首页 > 代码库 > 【BZOJ】1407 NOI 2002 荒岛野人Savage
【BZOJ】1407 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 long21 using namespace std;22 23 struct node24 {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 }
【BZOJ】1407 NOI 2002 荒岛野人Savage
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。