荒岛野人题解

荒岛野人题解

我真的是sha diao,这也没看出来,
两个野人不相遇,即是他们位置+走的步数mod m不相同,即不同余,
那我们只要枚举m,找出使条件满足的最小m不就行了

#include<bits/stdc++.h>
using namespace std;
const int N=20;
int n,c[N],p[N],l[N],x,y,maxa=0;
int exgcd(int a,int b,int &x,int &y){
    if(!b){x=1,y=0; return a;}
    int o=exgcd(b,a%b,x,y); int t=x; x=y,y=t-(a/b)*y; return o;
}
bool check(int qq){
     int q;
     for(int i=1;i<=n;++i)
         for(int j=i+1;j<=n;++j){
             q=qq;
             int d=exgcd(p[i]-p[j],q,x,y);
             if((c[j]-c[i])%d) continue;
             q=q/d; int w=(c[j]-c[i])/d;
             if(q<0) q=-q;
             x=(x*w%q+q)%q;
             if(!x) x=q;
             if(x<=l[i]&&x<=l[j]) return false;
         }
     return true;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i) scanf("%d%d%d",&c[i],&p[i],&l[i]),maxa=max(maxa,c[i]);
    for(register int i=maxa;i<=1e6;++i) if(check(i)){printf("%d\n",i); return 0;}
    return 0;
} 
posted @ 2019-10-12 22:01  lsoi_ljk123  阅读(128)  评论(0编辑  收藏  举报