洛谷题目链接

bzoj题目链接


题目大意:给定\(n\)组\(C_i, P_i, L_i\),求最小的\(M\)使得对于任意的\(i,j (1 \leq i, j \leq n)\)

\[C_i + P_i \times x \equiv C_j + P_j \times x \pmod M
\]

不成立

(这里的不成立指的是无解或者解出来的 \(x<\min(L_i,L_j)\),即相遇之前有一人死掉

其中\(x\)为正整数(就是走了\(x\)天相遇)

分析

从小到大枚举\(M\)(注意没有单调性不能二分

原式可变形为

\[C_i + P_i \times x = C_j + P_j \times x +M \times y
\]

\[(P_i-P_j)\times x - M \times y = C_j-C_i
\]

若无解,则此时的\(M\)为所求

若有解,用扩展欧几里得解出该方程的最小解\(x_{min}\)。

如果\(x_{min}<\min(L_i,L_j)\),问题解决;否则继续枚举

代码:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring> using namespace std; int n, C[20], p[20], l[20], mx = -1;
inline int gcd(int a, int b)
{
if(!b) return a;
else return gcd(b, a % b);
}
inline void exgcd(int a, int b, int &x, int &y)
{
if(!b) { x = 1, y = 0; return ; }
exgcd(b, a % b, x, y);
int t = x; x = y, y = t - (a / b) * y;
}
inline bool check(int m)
{
for(int i = 1; i <= n; i++)
for(int j = i + 1; j <= n; j++)
{
int a = p[j] - p[i], b = m, c = C[i] - C[j], x = 0, y = 0, g = gcd(a, b);
if(c % g == 0)
{
a /= g, b /= g, c /= g;
exgcd(a, b, x, y);
b = abs(b);
x = ((x * c) % b + b) % b;
if(!x) x += b;
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++)
if(check(i))
{
printf("%d\n", i);
return 0;
}
return 1;//防抄
}

题解【luogu P2421 bzoj P1407 [NOI2002]荒岛野人】的更多相关文章

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

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

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

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

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

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

  4. Luogu P2421 [NOI2002]荒岛野人

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

  5. 题解 P2421 【[NOI2002]荒岛野人】

    我的第一道数论紫题 首先,我们先看两个野人,他们相遇的充要条件是 \(C_i+P_i\times k\equiv C_j+P_j\times k\;(mod\;M)\) 其中\(k\)是第几年,且\( ...

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

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

  7. P2421 [NOI2002]荒岛野人

    传送门 答案不大于 $10^6$,考虑枚举答案 对于枚举的 ans,必须满足对于任意 i,j(i≠j) 都有 使式子$c_i+kp_i \equiv c_j+kp_j\ (mod\ ans)$成立的最 ...

  8. P2421 [NOI2002]荒岛野人 扩展欧几里得 枚举

    Code: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...

  9. 洛谷 P2421 [NOI2002]荒岛野人

    题目描述 又是一道扩欧的题. 要求一个最小的m使得 Ci+Pi*x≡Cj+Pj*x mod m(i!=j) 在x在第i个人和第j个人的有生之年无解. 也就是 (Pi-Pj)*x+m*y=Cj-Ci 在 ...

随机推荐

  1. lintcode172 删除元素

    删除元素   给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度. 元素的顺序可以改变,并且对新的数组不会有影响. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一个数组 [0, ...

  2. python3-声音处理

    先来说下二进制读写文件,这需要struct库 #二进制文件读写 import struct a= b=- # print(struct.pack("h",b)) # print(s ...

  3. 数据库Mysql的学习(六)-子查询和多表操作

    )*0.05 WHERE card_id ='20121xxxxxx'; //子查询就是一个嵌套先计算子查询 SELECT * FROM borrow WHERE book_id =(SELECT b ...

  4. 通过流的方式操作hadoop的API

    通过流的方式操作hadoop的API 功能: 可以直接用来操作hadoop的文件系统 可以用在mapreduce的outputformat中设置RecordWrite 参考: 概念理解 http:// ...

  5. mysql 按日期统计

    按年汇总,统计: select sum(mymoney) as totalmoney, count(*) as sheets from mytable group by date_format(col ...

  6. 01背包问题:DP

    题目描述: 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次. 第 i 件物品的体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大.输出 ...

  7. Windows10系统tensorflow-gpu安装

    准备工作 安装前请确保自己的显卡支持gpu加速,支持加速的gpu型号可在下面的链接中查询. https://www.geforce.com/hardware/technology/cuda/suppo ...

  8. 90 [LeetCode] Subsets2

    Given a collection of integers that might contain duplicates, nums, return all possible subsets (the ...

  9. LeetCode 109——有序链表转化二叉搜索树

    1. 题目 2. 解答 2.1. 方法一 在 LeetCode 108--将有序数组转化为二叉搜索树 中,我们已经实现了将有序数组转化为二叉搜索树.因此,这里,我们可以先遍历一遍链表,将节点的数据存入 ...

  10. Pandas dataframe数据写入文件和数据库

    转自:http://www.dcharm.com/?p=584 Pandas是Python下一个开源数据分析的库,它提供的数据结构DataFrame极大的简化了数据分析过程中一些繁琐操作,DataFr ...