bzoj1407 / P2421 [NOI2002]荒岛野人(exgcd)
洞穴数不超过1e6 ---> 枚举
判断每个野人两两之间是否发生冲突:exgcd
假设有$m$个洞穴,某两人(设为1,2)在$t$时刻发生冲突
那么我们可以列出方程
$c_{1}+p_{1}t\equiv c_{2}+p_{2}t (mod\quad m)$
移项一下:$(p_{1}-p_{2})t\equiv c_{2}-c_{1} (mod\quad m)$
去掉$(mod m)$,得$(p_{1}-p_{2})t-mx=c_{2}-c_{1} $
这不就是不定方程标准形式$ax+by=c$吗!
用exgcd搞搞,求出$t$的最小正整数解
如果$t<=min(l_{1},l_{2})$说明在两只的有生之年会发生冲突
此时$m$是不合法的,向下枚举就行了
复杂度$O(1e6n^{2}logp_{max})$,然鹅实际效率远高于介个
#include<iostream>
#include<cstdio>
#include<cstring>
#define re register
using namespace std;
int min(int a,int b){return a<b?a:b;}
int max(int a,int b){return a>b?a:b;}
#define N 17
int n,C[N],p[N],l[N],x0,y0,g;
void exgcd(int a,int b,int &x,int &y){
if(!b) g=a,x=,y=;
else exgcd(b,a%b,y,x),y-=x*(a/b);
}
bool check(int b){
for(int i=,a,c,q;i<=n;++i)
for(int j=i+;j<=n;++j){
a=((p[i]-p[j])%b+b)%b,c=C[j]-C[i];
exgcd(a,b,x0,y0);q=b/g;//求ax+by=gcd(a,b)
if(c%g) continue;
x0=(x0*c/g%q+q)%q;//先*c/g转成原来的式子,再%(b/gcd(a,b))得到最小解
if(<=x0&&x0<=min(l[i],l[j]))
return ;
}
return ;
}
int main(){
scanf("%d",&n); int st=;
for(int i=;i<=n;++i)
scanf("%d%d%d",&C[i],&p[i],&l[i]),st=max(st,C[i]);
for(re int i=st;i<=;++i)//注意是从洞穴编号最大的那个开始枚举
if(check(i)){printf("%d",i);break;}
return ;
}
bzoj1407 / P2421 [NOI2002]荒岛野人(exgcd)的更多相关文章
- P1516 青蛙的约会和P2421 [NOI2002]荒岛野人
洛谷 P1516 青蛙的约会 . 算是手推了一次数论题,以前做的都是看题解,虽然这题很水而且还交了5次才过... 求解方程\(x+am\equiv y+an \pmod l\)中,\(a\)的最小整数 ...
- 【题解】洛谷P2421[NOI2002]荒岛野人 (Exgcd)
洛谷P2421:https://www.luogu.org/problemnew/show/P2421 思路 从洞的最大编号开始增大枚举答案 对于每一个枚举的ans要满足Ci+k*Pi≡Cj+k*Pj ...
- 洛谷P2421 [NOI2002]荒岛野人(扩展欧几里得)
题目背景 原 A-B数对(增强版)参见P1102 题目描述 克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,…,M.岛上住着N个野人,一开始依次住在山洞C1,C2,… ...
- Luogu P2421 [NOI2002]荒岛野人
最近上课时提到的一道扩欧水题.还是很可做的. 我们首先注意到,如果一个数\(s\)是符合要求的,那么那些比它大(or 小)的数不一定符合要求. 因此说,答案没有单调性,因此不能二分. 然后题目中也提到 ...
- P2421 [NOI2002]荒岛野人
传送门 答案不大于 $10^6$,考虑枚举答案 对于枚举的 ans,必须满足对于任意 i,j(i≠j) 都有 使式子$c_i+kp_i \equiv c_j+kp_j\ (mod\ ans)$成立的最 ...
- P2421 [NOI2002]荒岛野人 扩展欧几里得 枚举
Code: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...
- 洛谷 P2421 [NOI2002]荒岛野人
题目描述 又是一道扩欧的题. 要求一个最小的m使得 Ci+Pi*x≡Cj+Pj*x mod m(i!=j) 在x在第i个人和第j个人的有生之年无解. 也就是 (Pi-Pj)*x+m*y=Cj-Ci 在 ...
- [NOI2002]荒岛野人(exgcd,枚举)
题目描述 克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,…,M.岛上住着N个野人,一开始依次住在山洞C1,C2,…,CN中,以后每年,第i个野人会沿顺时针向前走Pi ...
- 题解 P2421 【[NOI2002]荒岛野人】
我的第一道数论紫题 首先,我们先看两个野人,他们相遇的充要条件是 \(C_i+P_i\times k\equiv C_j+P_j\times k\;(mod\;M)\) 其中\(k\)是第几年,且\( ...
随机推荐
- PHP面向对象 实例化 构造函数 封装 继承 静态
PHP面向对象 实例化 构造函数 封装 继承 静态 面向对象: 一:定义类 class Dog { var $name; var $age; var $pinzhong; function Jiao( ...
- 网络子系统46_ip协议数据帧的转发
//调用路径ip_rcv->ip_rcv_finish->dst_input->(skb->dst->input) //ip_forward以回调函数的形式,保存在skb ...
- 学习Ruby你需要了解的相关知识(rvm, gem, bundle, rake, rails等)
这篇文章主要介绍了学习Ruby你需要了解的相关知识(rvm, gem, bundle, rake, rails等),需要的朋友可以参考下 Ruby 这个就不用多说了 RVM 用于帮你安装Rub ...
- js 数组函数
Array.prototype.join Array.prototype.reverse Array.prototype.sort Array.prototype.concat Array.proto ...
- IOS项目分层
上传者:踏浪帅 分类:其他(Others) 查看次数:408 下载次数:70 上传时间:2016-01-07 大小:3 KB 主项目中的分层主要包含四个模块,Main(主要).Expand(扩展).R ...
- 监控linux流量shell版
想要实时查看linux流量情况,又不想再去下第三方工具,可以直接写脚步运行! 系统:centos 6.5 原理:从/proc/net/dev中获取到流量情况,再通过换算并除以间隔时间来得到流量单位M ...
- Android动态加载ListView中的Item
我这周上网看到动态增加listview的每一项item的布局,今天抽空自己写了一个,方便自己日后使用,这个效果还是很不错的,用到了Adapter的notifyDataSetChanged()方法,当点 ...
- 微信小程序 --- 模板的使用
由于微信小程序文件大小的限制,可以把一些公用的文件 单离出来形成模板,从而被各个模板引用: 定义模板第一种方式: 新建一个目录: 写入: <text>hello world</tex ...
- MVC认识
1.ASP.NET两种开发模式的简单比较(WebForm和MVC) (1)WebForm开发模式 当用户输入网址https://i.cnblogs.com/EditPosts.aspx?opt=1进行 ...
- CentOS7.2使用yum配置LNMP环境
一,安装系统查看 二,yum安装nginx 设置yum源 rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-c ...