怎么枚举下答案就过了。。。。
以后exgcd还是这么写比较稳当。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #define maxn 20 using namespace std; int n,c[maxn],p[maxn],l[maxn],mx=0,x,y; int gcd(int a,int b) { if (b==0) return a; return gcd(b,a%b); } void exgcd(int a,int b,int &x,int &y) { if (b==0) {x=1;y=0;return;} exgcd(b,a%b,x,y); int t=x;x=y;y=t-a/b*y; } bool judge(int m) { for (int i=1;i<=n;i++) for (int j=i+1;j<=n;j++) { int a=p[i]-p[j],b=c[j]-c[i],z=m; int d=gcd(a,z); if (b%d) continue; a/=d;z/=d;b/=d; exgcd(a,z,x,y); z=abs(z);x=((x*b)%z+z)%z;if (!x) x=z; 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<=1000000;i++) { if (judge(i)) { printf("%d\n",i); return 0; } } printf("-1\n"); return 0; }