题意:给出n组x,y,z。判断是否存在一个id使得id%x1∈(y1,z1),id%x2∈(y2,z2)。
析:
设 id/x1=a , id/x2=b ,则
id-a*x1=u; (1)
id-b*x2=v; (2)
(1)-(2)得 一阶不定方程: bx2-ax1=u-v .
方程可解性为是否存在 (u-v) 是gcd(x1,x2)的整数倍。
那么也就是判断y[x1]-z[x2], z[x1]-y[x2],这就是范围,然后在判断是的时候,如果两个端点能够整除,就返回真,如果两个端点除以g,
不相等,那么一定有一个数能整除g。
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1000 + 5; int x[maxn], y[maxn], z[maxn]; int n; bool judge(int g, int l, int r){ if(l % g == 0 || r % g == 0) return true; return l / g != r / g; } bool solve(){ for(int i = 0; i < n; ++i){ for(int j = i+1; j < n; ++j){ int g = __gcd(x[i], x[j]); if(judge(g, y[i]-z[j], z[i]-y[j])) return true; } } return false; } int main(){ while(scanf("%d", &n) == 1){ for(int i = 0; i < n; ++i) scanf("%d %d %d", &x[i], &y[i], &z[i]); if(solve()) puts("Cannot Take off"); else puts("Can Take off"); } return 0; }