BZOJ 1407 Savage

Posted on 2016-10-17 22:33  ziliuziliu  阅读(113)  评论(0编辑  收藏  举报

怎么枚举下答案就过了。。。。

以后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;
}