[NOI2002]Sevege 扩展欧几里得

枚举答案m,对于每两个野人,同余方程(Ci-Cj)+x(Pi-Pj)=0(mod m)无解或最小正整数解大于min(Li,Lj)即可。注意m从maxCi开始枚举。
错点:exgcd中y=y-x*(a/b)最初没打括号。
代码:

#include
#include
#include
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;
}


你可能感兴趣的:(数论)