题解 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;
}