Solution:
S
o
l
u
t
i
o
n
:
枚举
m≥max(ai)
m
≥
m
a
x
(
a
i
)
使得对于任意两个人
i
i
,均有
(ai+x∗pi)
(
a
i
+
x
∗
p
i
)
%
m=(aj+x∗pj)
m
=
(
a
j
+
x
∗
p
j
)
%
m
m
无解或最小整数解。
化简得
(pi−pj)∗x−m∗y=aj−ai
(
p
i
−
p
j
)
∗
x
−
m
∗
y
=
a
j
−
a
i
,等价于求
ax+by=c
a
x
+
b
y
=
c
的一组最小整数解。
在
exgcd
e
x
g
c
d
的迭代过程中假如
b=0
b
=
0
且
a|c
a
|
c
,则
x=ca
x
=
c
a
,否则无解。
P.S:
P
.
S
:
扩展欧几里得算法
假如
b=0
b
=
0
,由于
gcd(a,b)=1
g
c
d
(
a
,
b
)
=
1
,因此
a=x=1
a
=
x
=
1
。
假如
b≠0
b
≠
0
,不妨假设
a=kb+r
a
=
k
b
+
r
,并且我们已经求出了
bx+ry=1
b
x
+
r
y
=
1
的一组整数解
(x0,y0)
(
x
0
,
y
0
)
。
bx0+(a−kb)y0=1
b
x
0
+
(
a
−
k
b
)
y
0
=
1
ay0+b(x0−ky0)=1
a
y
0
+
b
(
x
0
−
k
y
0
)
=
1
令
x1=y0,y1=x0−ky0
x
1
=
y
0
,
y
1
=
x
0
−
k
y
0
,那么
(x1,y1)
(
x
1
,
y
1
)
就是
ax+by=1
a
x
+
b
y
=
1
的一组整数解。
不断迭代即可。
Code:
C
o
d
e
:
#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;
}
}