【扩展GCD】荒岛野人

本文介绍了一道关于野人洞穴的数学问题,野人每年按固定步数顺时针移动,求解最少需要多少个洞穴才能确保野人在有生之年内不会相遇。通过分析,将问题转化为扩展GCD的应用,详细阐述了解题思路和代码实现。
摘要由CSDN通过智能技术生成

题目

【题目描述】
克里特岛以野人群居而著称。岛上有排列成环行的M个山洞。这些山洞顺时针编号为1,2,…,M。岛上住着N个野人,一开始依次住在山洞C1,C2,…,CN中,以后每年,第i个野人会沿顺时针向前走Pi个洞住下来。每个野人i有一个寿命值Li,即生存的年数。下面四幅图描述了一个有6个山洞,住有三个野人的岛上前四年的情况。三个野人初始的洞穴编号依次为1,2,3;每年要走过的洞穴数依次为3,7,2;寿命值依次为4,3,1。
这里写图片描述

奇怪的是,虽然野人有很多,但没有任何两个野人在有生之年处在同一个山洞中,使得小岛一直保持和平与宁静,这让科学家们很是惊奇。他们想知道,至少有多少个山洞,才能维持岛上的和平呢?
【输入】
输入文件的第1行为一个整数N(1<=N<=15),即野人的数目。第2行到第N+1每行为三个整数Ci, Pi, Li (1<=Ci,Pi<=100, 0<=Li<=10^6 ),表示每个野人所住的初始洞穴编号,每年走过的洞穴数及寿命值。
【输出】
输出文件仅包含一个数M,即最少可能的山洞数。输入数据保证有解,且M不大于10^6。
【样例输出】
3
1 3 4
2 7 3
3 2 1
【样例输出】
6
【提示】
该样例对应于题目描述中的例子。


题解

看完题目后,我忍不住吐槽一句——题目好烂!
题目中说野人群居,但是却又让野人单独居住,这还叫群居吗?!
好了,回归正题。这题一看就知道是一道数学题(废话),直接暴力是肯定不行的(废话)。

可以先枚举m,再枚举所有两个野人的情况,看看他们会不会在有生之年相遇在同一个山洞。
前面的枚举很简单,关键在于如何判断。

设野人 i 和野人 j 在第 x 年相遇,那么可以列出同余方程:
C i + P i ⋅ x ≡ C j + P j ⋅ x ( m o d   m ) C i + P i ⋅ x = C j + P j ⋅ x + m y (转化) P i ⋅ x − P j ⋅ x = m y + C j − C i (移项) ( P i − P j ) x − m y = C j − C i (化简) \begin{aligned} C_i+P_i\cdot x & \equiv C_j+P_j\cdot x & \text{$(mod\space m)$}\\ C_i+P_i\cdot x & =C_j+P_j\cdot x+my & \text{(转化)}\\ P_i\cdot x-P_j\cdot x & =my+C_j-C_i & \text{(移项)}\\ (P_i-P_j)x-my & =Cj-Ci & \text{(化简)} \end{aligned} Ci+PixCi+PixPixPjx(PiPj)xmyCj+

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值