题目描述

样例

3
1 3 4
2 7 3
3 2 1
6

分析

首先,我们先设4个变量,初始坐标 \(d[i]\),每年步数 \(p[i]\),寿命 \(l[i]\),根据题目很容易得到一个不等式

(假设i,j是两个野人的标号,x为经过的年数):$(d[i] + p[i] * x) % m != (d[j] + p[j] * x) % m $。

解不等式。。。不会,但可以转化一下,把不等式转为等式 \((d[i] + p[i] * x) % m = (d[j] + p[j] * x) % m\),使等式无解,

无解条件就是解得的x的最小,正整数解比两个野人的其中一个的寿命要大即可。

但这个等式用代码解就需要转换一下,假设 \((d[i] + p[i] * x) % m = (d[j] + p[j] * x) % m = t,\)

\((d[i] + p[i] * x) = m * y1+t,(d[j] + p[j] * x) = m * y2+t。\)

那么等式就可以化为:\(d[i] + p[i] * x - m * y1 = d[j] + p[j] * x - m * y2;\)

即为:$ d[i] - d[j] = (p[i] - p[j]) * x + m * (y1 - y2)$ 。这就转化成了 $ ax+by=c $ 的形式,

可以用扩展欧几里得定理做,这里的y对答案无贡献,可忽略, 接下来就是用公式求最小正整数解了。

补如何求 \(ax + by = c\) 的最小正整数解

对于 \(ax + by = c\) 的方程, 先用扩展欧几里得解出方程 \(ax + by = gcd(a,b)\) 的一组解 \((x,y)\),

接着判断 \(c % gcd(a,b)\) 是否等于0,如果不等于则方程无解

然后假设 \(b1 = b / gcd(a,b)\) ,\(x1 = (x + b1) * (c / gcd(a,b) )\) ;

那么方程的最小正整数解为 \(x1 = (x1 % b1 + b1) % b1,y1 = (c - a * x1) / b\);

solution

#include<bits/stdc++.h>
const int maxn=1<<5;
const int inf=0x7f7f7f7f;
using namespace std;
int n,r,m,q,x,y,a,b,t,d[maxn],p[maxn],l[maxn]; int exgcd(int a,int b,int &x,int &y) { //解方程模板
if (b==0) {
x=1;
y=0;
return a;
}
int ret=exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return ret;
} bool check(int z)
{
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++) //枚举没两个野人,看是否符合方程
{
a=p[i]-p[j];
b=d[j]-d[i];
m=z;
x=0,y=0;
int q=exgcd(a,m,x,y); //gcd(a,b)
if(b%q)continue; //无解
b/=q; // b此时等价于c/gcd(a,b);
m/=q; //等价于上面的b1
if(m<0)m=-m; //不确定正负
t=(x+m)*b;
t=(t%m+m)%m; //最小正整数解公式
if(t<=l[i]&&t<=l[j]) return 0; //方程无解
}
}
return 1;
} int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d%d",&d[i],&p[i],&l[i]),r=max(r,d[i]);
for(int i=r;i<=1e6;i++) //枚举到极限数据,找到最小的就输出
{
if(check(i))
{
printf("%d\n",i);
return 0;
}
} return 0;
}

荒岛野人Savage的更多相关文章

  1. 【BZOJ】1407 NOI 2002 荒岛野人Savage

    拓展欧几里得入门题 两个野人若要走到同一个洞穴,设他们走了x步,则p[i]*x+c[i]≡p[j]*x+c[j](mod ans),ans即答案: 移项得到(p[i]-p[j])*X+ansY=c[j ...

  2. bzoj1407 / P2421 [NOI2002]荒岛野人(exgcd)

    P2421 [NOI2002]荒岛野人 洞穴数不超过1e6 ---> 枚举 判断每个野人两两之间是否发生冲突:exgcd 假设有$m$个洞穴,某两人(设为1,2)在$t$时刻发生冲突 那么我们可 ...

  3. P1516 青蛙的约会和P2421 [NOI2002]荒岛野人

    洛谷 P1516 青蛙的约会 . 算是手推了一次数论题,以前做的都是看题解,虽然这题很水而且还交了5次才过... 求解方程\(x+am\equiv y+an \pmod l\)中,\(a\)的最小整数 ...

  4. 洛谷P2421 [NOI2002]荒岛野人(扩展欧几里得)

    题目背景 原 A-B数对(增强版)参见P1102 题目描述 克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,…,M.岛上住着N个野人,一开始依次住在山洞C1,C2,… ...

  5. Luogu P2421 [NOI2002]荒岛野人

    最近上课时提到的一道扩欧水题.还是很可做的. 我们首先注意到,如果一个数\(s\)是符合要求的,那么那些比它大(or 小)的数不一定符合要求. 因此说,答案没有单调性,因此不能二分. 然后题目中也提到 ...

  6. NOI 2002 荒岛野人

    人生第一次做NOI的题祭!!! 大概是NOI最简单的一道题 克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,…,M.岛上住着N个野人,一开始依次住在山洞C1,C2,… ...

  7. 【NOI2002】荒岛野人

    [题解] 可以枚举m 那么任意两个野人之间有 c[i]+x*p[i]=c[j]+x*p[j] (mod m)  无解,或 x 的最小值<=min(l[i] , l[j]) 化为丢番图方程:(p[ ...

  8. 【题解】洛谷P2421[NOI2002]荒岛野人 (Exgcd)

    洛谷P2421:https://www.luogu.org/problemnew/show/P2421 思路 从洞的最大编号开始增大枚举答案 对于每一个枚举的ans要满足Ci+k*Pi≡Cj+k*Pj ...

  9. [NOI2002]荒岛野人(exgcd,枚举)

    题目描述 克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,…,M.岛上住着N个野人,一开始依次住在山洞C1,C2,…,CN中,以后每年,第i个野人会沿顺时针向前走Pi ...

  10. CodeVS1747_NOI2002_荒岛野人_Savage_C++

    题目:http://codevs.cn/problem/1747/ 对于一个环,我们经常用取余来表示它走过若干圈后的位置 那么第 i 个野人第 x 年时所在的位置可表示为:(c[i]+p[i]*x)% ...

随机推荐

  1. 8 CSS文本属性

    8 文本属性 font-style(字体样式风格) /* 属性值: normal:设置字体样式为正体.默认值. italic:设置字体样式为斜体.这是选择字体库中的斜体字. oblique:设置字体样 ...

  2. #交互#CF1375F Integer Game

    题目 有三堆石子初始石子数分别为\(a,b,c\),可以选择先手还是后手操作, 每次操作形如先手选择一个正整数 \(k\) ,后手自由选择一堆石子加上 \(k\) , 但是不能和上一次操作选择的石堆相 ...

  3. JDK14性能管理工具:jmap和jhat使用介绍

    目录 简介 jmap clstats finalizerinfo histo dump jhat 总结 简介 我们在写代码的过程中,经常会遇到内存泄露的问题,比如某个集合中的对象没有被回收,或者内存出 ...

  4. 1. Vectors and Linear Combinations

    1.1 Vectors We have n separate numbers \(v_1.v_2.v_3,...,v_n\),that produces a n-dimensional vector ...

  5. R语言学习3:数据框处理(1)

    本系列是一个新的系列,在此系列中,我将和大家共同学习R语言.由于我对R语言的了解也甚少,所以本系列更多以一个学习者的视角来完成. 参考教材:<R语言实战>第二版(Robert I.Kaba ...

  6. centos环境Jenkins配置war包Tomcat

    末尾有软件安装包,自行下载(centos环境) centos JDK Jenkins maven tomcat git myslq nginx 7.9 11.0.19 2.418 3.8.1 9.0. ...

  7. Python基于Excel数据加以反距离加权空间插值并掩膜图层

      本文介绍基于Python中ArcPy模块,实现Excel数据读取并生成矢量图层,同时进行IDW插值与批量掩膜的方法. 1 任务需求   首先,我们来明确一下本文所需实现的需求.   现有一个记录有 ...

  8. Ubuntu SVN 需要证书及密码验证问题

    问题概览 问题一 Ubuntu 20.04 下使用 SVN ,会报错 SVN 的证书错误,无论是选择接受 t 还是永久接受 p,下次都会要求再次接受:在 kali 或者 Windows 上没有出现该问 ...

  9. c# 解决死锁问题Monitor

    前言 在高并发中,一个很关键的问题就是要避免死锁. 那么为什么会产生死锁呢?这种情况多见吗? 举一个例子: 比如方法一中先lock(object1),在lock(object1)中lock(objec ...

  10. 力扣595(MySQL)-大的国家(简单)

    题目: World 表: 如果一个国家满足下述两个条件之一,则认为该国是 大国 : 面积至少为 300 万平方公里(即,3000000 km2),或者人口至少为 2500 万(即 25000000)编 ...