[NOI 2002]Sevege拡張ユークリッド

3864 ワード

答え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;
}