题意:传送门
题解:给定了C[i],p[i],l[i],然后现在需要满足以下条件:
继续展开:
其中这个要么无解,要么有解的情况下,这个x也必须>min(l[i],l[j]),然后就可以判断了,这个不符合二分连续性,一个一个判断即可。注意最后拓展gcd回来的写法
附上代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=20+5;
int n,C[maxn],p[maxn],l[maxn],mx=-1;
inline int exgcd(int a,int b,int &x,int &y)
{
if(b==0){
x=1;y=0;return a;
}else{
int x1,y1;
int r=exgcd(b,a%b,x1,y1);
x=y1;
y=x1-(a/b)*y1;
return r;
}
}
inline bool check(int m)
{
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
int a=p[j]-p[i],b=m,c=C[i]-C[j],x,y;
int g=exgcd(a,b,x,y);
if(c%g==0){
x=x*c/g;
int t=abs(b/g);
if(x<=0){
x=x%t+t;
}else{
x=x%t;
}
if(x<=min(l[i],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]);
mx=max(mx,C[i]);
}
for(int i=mx;;i++){
if(check(i)){
printf("%d\n",i);
break;
}
}
return 0;
}