题解 guP2421 【[NOI2002]荒岛野人】

本题珂以转换成一个式子

即求Ci + Pi × x ≡ Cj
+
Pj
× x (mod M)
的最小答案是否大于寿命最小值

以人数为最小值开始枚举山洞数,用扩展欧几里得计算最优答案是否大于寿命

若不大于则山洞数+1

P . S .若该式无解则当最优解大于寿命处理

#include<bits/stdc++.h>
using namespace std;
bool f;
int c[20],p[20],l[20],n,x,y,x0,x1,maxx,anss;
int gcd(int a,int b)
{
    if(b==0) return a;
    return gcd(b,a%b);
}
void exgcd(long long a,long long b)
{
    if(b==0)
    {
        x0=1;
        x1=0;
        return;
    }
    exgcd(b,a%b);
    int v=x0;
    x0=x1;
    x1=v-(a/b)*x1;
    return;
}
bool check(int m)
{
    for(register int i=1;i<n;i++)
    {
        for(register int j=i+1;j<=n;j++)
        {
            int v=p[j]-p[i],s=c[i]-c[j];
            if(v<0)
            {
                s=-s;
                v=-v;
            }
            int g=gcd(v,m);
            if(s%g!=0)
            continue;
            exgcd(v,m);
            int mm=m/g;
            anss=((x0*(s/g))%mm+mm)%mm;
            if(anss<=l[i]&&anss<=l[j])
            return false;
        }
    }
    return true;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>c[i]>>p[i]>>l[i];
        maxx=max(maxx,c[i]);
    }
    for(register int m=maxx;;m++)
    {
        if(check(m))
        {
            cout<<m;
            return 0;
        }
    }
    return 0;
}
posted @ 2019-03-22 18:54  恨妹不成穹  阅读(165)  评论(0编辑  收藏  举报