枚举
使得对于任意两个人
,
均有
%
%
无解或最小整数解
。
化简得
,等价于求
的一组最小整数解。
在
的迭代过程中假如
且
,则
,否则无解。
扩展欧几里得算法
假如
,由于
,因此
。
假如
,不妨假设
,并且我们已经求出了
的一组整数解
。
令
,那么
就是
的一组整数解。
不断迭代即可。
#include<bits/stdc++.h>
#define N 105
using namespace std;
int p[N],c[N],l[N],n,m,ans,x,y;
void exgcd(int a,int b,int &x,int &y)
{
if(b==0){x=ans;y=0;return;}
exgcd(b,a%b,x,y);
int t=x;x=y;y=t-a/b*y;
}
bool work(int k)
{
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
{
int a=p[i]-p[j];
int b=k;
ans=c[j]-c[i];
int t=__gcd(a,b);
if(ans%t==0)
{
a/=t,b/=t,ans/=t;
exgcd(a,b,x,y);
b=abs(b);
x=(x%b+b)%b;
if(!x)x+=b;
if(x<=min(l[i],l[j]))return false;
}
}
return true;
}
int main()
{
scanf("%d",&n);
int maxn=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&c[i],&p[i],&l[i]);
maxn=max(maxn,c[i]);
}
for(int i=maxn;;i++)
if(work(i))
{
printf("%d\n",i);
return 0;
}
}