枚举答案m,对于每两个野人,同余方程(Ci-Cj)+x(Pi-Pj)=0(mod m)无解或最小正整数解大于min(Li,Lj)即可。注意m从maxCi开始枚举。
错点:exgcd中y=y-x*(a/b)最初没打括号。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,c[20],p[20],l[20],ans=0;
int exgcd(int a,int b,int &x,int &y)
{
if(b==0) {x=1;y=0;return a;}
int re=exgcd(b,a%b,y,x);
y=y-x*(a/b);
return re;
}
bool check(int a,int b,int c,int lim)
{
a=(a%b+b)%b;c=(c%b+b)%b;
int gcd,x,y;
gcd=exgcd(a,b,x,y);
if(c%gcd!=0) return 1;
b/=gcd;
x=(x*(c/gcd)%b+b)%b;
return (x>lim);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&c[i],&p[i],&l[i]);
ans=max(ans,c[i]);
c[i]--;
}
for(;;ans++)
{
bool pd=1;
for(int i=1;(i<=n)&&pd;i++)
for(int j=i+1;(j<=n)&&pd;j++)
pd=pd&&check(p[i]-p[j],ans,c[j]-c[i],min(l[i],l[j]));
if(pd){printf("%d",ans);break;}
}
return 0;
}