这里的判断用的是 P5656 第一篇题解的写法。
#include <iostream>
#include <algorithm>
#include <bitset>
#include <deque>
#include <cmath>
#define int long long
using namespace std;
const int N = 1e6 + 10;
int c[N],p[N],l[N];
int gcd(int a,int b){
if(!b) return a;
else return gcd(b,a % b);
}
void exgcd(int a,int b,int &x,int &y){
if(a % b == 0){
x = 0,y = 1;
}else{
exgcd(b,a % b,y,x);
y -= a / b * x;
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n,s = 0;cin >> n;
for(int i = 1;i <= n;i ++){
cin >> c[i] >> p[i] >> l[i];
s = max(s,c[i]);
c[i] --;
}
for(int m = s;m <= 1000000;m ++){
int flag = 1;
for(int i = 1;i <= n;i ++){
for(int j = i + 1;j <= n;j ++){
int a = p[i] - p[j],b = m;
int cc = c[j] - c[i];
//cout << a << ' ' << b << ' ' << cc << ' ';
if(cc == 0 && a == 0) continue;
else if(cc != 0 && a == 0){
flag = 0;break;
}else if(cc % gcd(a,b) != 0){
//cout << -1 << '\n';
continue;
}else{
if(a < 0) a = -a,cc = -cc;
int x,y;
exgcd(a,b,x,y);
//cout << x << ' ' << y << '\n';
//if(cc < 0) x = -x,y = -y,cc = -cc;
//if(a < 0) a = -a,cc = -cc;
//if(a < 0) x = -x,a = -a;
int xx = x * cc / gcd(a,b);
int dx = b / gcd(a,b);
int mn = ceil((-xx + 1) * 1.0 / dx);
if(xx + mn * dx <= min(l[i],l[j])){
flag = 0;break;
}
}
}
if(!flag) break;
}
if(flag){
cout << m;return 0;
}
}
return 0;
}