枚举每对野人后扩展欧几里得即可.
这样做理论复杂度貌似会爆结果没爆OLZ…
AC code:
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=101;
const int INF=1<<29;
int n,m0;
int c[N],p[N],l[N];
void exgcd(int &x,int &y,int a,int b){
if(!b){
x=1;y=0;
return ;
}
exgcd(x,y,b,a%b);
int xx=x,yy=y;
x=yy;y=xx-(a/b)*yy;
}
int solve(int a,int b,int c){
int x,y,g;
if(a<0) a=(a/c+1)*c+a;
if(b<0) b=(b/c+1)*c+b;
exgcd(x,y,a,c);
g=a*x+c*y;
if(b%g) return INF;
x*=b/g;
c/=g;
if(x<0) x=((-x/c)+1)*c+x;
x%=c;
return x;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&c[i],&p[i],&l[i]);
if(c[i]>m0) m0=c[i];
}
for(int i=m0;i<=1000000;i++){
bool flag=1;
for(int j=1;j<=n-1&&flag;j++){
for(int k=j+1;k<=n&&flag;k++){
int x=solve(p[j]-p[k],c[k]-c[j],i);
if(x<=min(l[j],l[k])) flag=0;
}
}
if(flag){
printf("%d",i);
break;
}
}
return 0;
}