题目让求是否有一组解(n,m)满足方程 n*x1+k1=m*x2+k2,,y1<=k1<=z1,y2<=k2<=z2。
移项后变成:n*x1- m*x2=k2-k1,,y2-z1<=k2-k1<=z2-y1。
也就是:n*x1- m*x2=c,,y2-z1<=c<=z2-y1。
我们知道对于一阶不定方程a*n+b*m=gcd(a,b)肯定存在一组整数解。
那么我们就可以看一下gcd(x1,x2)或者gcd(x1,x2)的整数倍是否在区间[y2-z1,z2-y1]中就可以找到是否可解了。
具体做的时候我们可以把存在负区间的区间转化为全为正的区间,然后判断是否包含gcd的正整数倍就OK了。
#pragma warning(disable:4996)
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1005;
int x[N], y[N], z[N];
int gcd(int a, int b){
if (b == 0)return a;
return gcd(b, a%b);
}
int main(){
int n;
while (~scanf("%d", &n)){
for (int i = 1; i <= n; i++){
scanf("%d %d %d", x + i, y + i, z + i);
}
bool flag = true;
for (int i = 1; i < n; i++){
for (int j = i + 1; j <= n; j++){
int g = gcd(x[i], x[j]);
int l = y[j] - z[i], r = z[j] - y[i];
//转化区间
if (r <= 0){
swap(l, r);
l = -l; r = -r;
}
else if (l < 0){
l = -l;
r = max(l, r);
l = 0;
}
//查看是否包含有正整数倍的gcd
int mul1 = l / g;
if (l%g != 0)mul1++;
int mul2 = r / g;
if (mul1 <= mul2){
flag = false;
break;
}
}
if (!flag)break;
}
if (flag)puts("Can Take off");
else puts("Cannot Take off");
}
return 0;
}