[noi2002]荒岛野人 拓展欧几里得
克里特岛以野人群居而著称。岛上有排列成环行的M个山洞。这些山洞顺时针编号为1,2,…,M。岛上住着N个野人,一开始依次住在山洞C1,C2,…,CN中,以后每年,第i个野人会沿顺时针向前走Pi个洞住下来。每个野人i有一个寿命值Li,即生存的年数。下面四幅图描述了一个有6个山洞,住有三个野人的岛上前四年的情况。三个野人初始的洞穴编号依次为1,2,3;每年要走过的洞穴数依次为3,7,2;寿命值依次为4,3,1。
奇怪的是,虽然野人有很多,但没有任何两个野人在有生之年处在同一个山洞中,使得小岛一直保持和平与宁静,这让科学家们很是惊奇。他们想知道,至少有多少个山洞,才能维持岛上的和平呢?
枚举最小年份,然后判断此年份是否可行;
如何判断可行,只要两个野人有生之年都不会在一个洞里住,那么就可行;
枚举i,j野人,得ci-cj=(pj-pi)*x+ky x表示会相遇的年份;
若无解,说明不会碰到;
否则用ex_gcd求出一个解,然后根据这个解求出x的最小正整数解,与min(l[i],l[j])比较一下,即可判断;
我犯的主要错误是,算出一个x后,x=x*(c[i]-c[j])/d,x=(x%k+k)%k,这里的k应换成k/d,这是由于x+k*t固然是它的解集,但是由于k和p[j]-p[i]之间还有一些公因数,所以漏掉了一些情况,所以计算之前先将k/d,这样就不会再wa了;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<ctime>
#include<vector>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
#define LL long long
const int maxn=;
void gcd(int a,int b,int &d,int &x,int &y){
if(b==){d=a;x=;y=;return;}
gcd(b,a%b,d,x,y);
int t=x;
x=y;
y=t-a/b*x;
}
int gcd(int a,int b){return b==?a:gcd(b,a%b);}
int c[maxn],p[maxn],l[maxn],n,Left=;
void init(){
cin>>n;
for(int i=;i<=n;i++){cin>>c[i]>>p[i]>>l[i];Left=max(Left,c[i]);}
int x,y,d,kl;
for(int k=Left;k<=;k++){
bool flag=;
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++){
if(flag)break;
gcd(p[j]-p[i],k,d,x,y);
if((c[i]-c[j])%d)continue;
x=x*(c[i]-c[j])/d;
kl=k/d;
x=(x%kl+kl)%kl;
if(x<=l[i]&&x<=l[j])flag=;
}
if(!flag){printf("%d\n%d\n",k,clock());return;}
}
}
int main(){
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
init();
return ;
}
其实我更想吐槽把10^6,弄成106的事情,即使一般有经验的人都不会被坑;
[noi2002]荒岛野人 拓展欧几里得的更多相关文章
- 洛谷P2421 [NOI2002]荒岛野人(扩展欧几里得)
题目背景 原 A-B数对(增强版)参见P1102 题目描述 克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,…,M.岛上住着N个野人,一开始依次住在山洞C1,C2,… ...
- JZYZOJ1372 [noi2002]荒岛野人 扩展欧几里得
http://172.20.6.3/Problem_Show.asp?id=1372 想法其实很好想,但是我扩展欧几里得还是用得不熟练,几乎是硬套模板,大概因为今天一个下午状态都不大好.扩展欧几里得算 ...
- P2421 [NOI2002]荒岛野人 扩展欧几里得 枚举
Code: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...
- BZOJ-1407 Savage 枚举+拓展欧几里得(+中国剩余定理??)
zky学长实力ACM赛制测试,和 大新闻(YveH) 和 华莱士(hjxcpg) 组队...2h 10T,开始 分工我搞A,大新闻B,华莱士C,于是开搞: 然而第一题巨鬼畜,想了40min发现似乎不可 ...
- 【lydsy1407】拓展欧几里得求解不定方程+同余方程
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1407 题意: 有n个野人,野人各自住在第c[i]个山洞中(山洞成环状),每年向前走p[i] ...
- NOIP2012拓展欧几里得
拉板题,,,不说话 我之前是不是说过数据结构很烦,,,我想收回,,,今天开始的数论还要恶心,一早上听得头都晕了 先来一发欧几里得拓展裸 #include <cstdio> void gcd ...
- poj 1061 青蛙的约会 拓展欧几里得模板
// poj 1061 青蛙的约会 拓展欧几里得模板 // 注意进行exgcd时,保证a,b是正数,最后的答案如果是负数,要加上一个膜 #include <cstdio> #include ...
- bzoj4517: [Sdoi2016]排列计数--数学+拓展欧几里得
这道题是数学题,由题目可知,m个稳定数的取法是Cnm 然后剩下n-m本书,由于编号为i的书不能放在i位置,因此其方法数应由错排公式决定,即D(n-m) 错排公式:D[i]=(i-1)*(D[i-1]+ ...
- POJ 2891 Strange Way to Express Integers(拓展欧几里得)
Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express ...
随机推荐
- VMware虚拟机直连物理网络的两种方式
VMware虚拟机直连物理网络的两种方式 使用VMware构建虚拟机,通常虚拟机都使用NAT模式.这时,虚拟机有独立的网段.使用NAT模式,虚拟机之间数据都通过虚拟网络传输,不会影响实体机所在的实 ...
- PyTorch学习笔记之Tensors
PyTorch Tensors are just like numpy arrays, but they can run on GPU.No built-in notion of computatio ...
- arcgis andriod Edit features
来自:https://developers.arcgis.com/android/guide/edit-features.htm#ESRI_SECTION1_56C60DB71AF941E98668A ...
- win7阻止iis开机启动
https://zhidao.baidu.com/question/111234812.html 1.在"开始/运行/" 输入"services.msc" 启动 ...
- Linux文件内容查阅
直接查阅一个文件的内容:cat/tac/nl命令 cat (concatenate) # cat [-AbEnTv] 选项与參数: -A :相当於 -vET 的整合选项.可列出一些特殊字符而不是空白 ...
- 百科知识 epub文件如何打开
.epub 简介 EPub是一个自由的开放标准,属于一种可以"自动重新编排"的内容:也就是文字内容可以根据阅读设备的特性,以最适于阅读的方式显示.EPub档案内部使用了XHTML或 ...
- 改进后的向量空间模型(VSM)
我们採用更加形式化的定义,并採用稍大一些的样例来展示怎样使用基于数据集频率的权重.相应于一个给定的词项,其权重使用IDF(逆文档频率)来计算. 为了给每篇文档建立一个相应的向量,能够考虑例如以下定义. ...
- flexible.js + makegrid.js 自适应布局
一,flexible.js 的使用方式: (一),引用方式 1,引用cdn地址 <script src="http://g.tbcdn.cn/mtb/lib-flexible/0.3. ...
- binary-tree-level-order-traversal I、II——输出二叉树的数字序列
I Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to righ ...
- windows程序设计——飞机大战笔记(Access数据库的使用)
//////////////////2015/07/22/////////////////// /////////////////by xbw ///////////////////////// // ...