HDU4596 Yet another end of the world 扩展欧几里德性质
这题坑了,我真该吃翔啊,竟然一開始方程设错了并且没有去想连列的问题,我真是坑货,做不出就该又一次理一下嘛。操蛋。
题意:给了N组x,y,z然后 问你是否存在两个或者两个以上的id,是的 id%x的值在区间[y,z]之间。若有则输出Cannot Take off
否则你懂得
依据题意 那么 列出 :
a*x1 + y1 <= id <= a*x1 + z1
b * x2 + y2 <= id <= b*x2 + z2,
如果有解的话,那么这两个区间肯定有反复部分。,那么继续推得:
a*x1 <= b*x2 + z2 和 b *x2 + y2 <= a*x1 + z1
化简能够得到
a* x1 - b* x2 <= z2 - y1 1号式子
b * x2 - a*x1 <= z1 - y2 2号式子
为了统一 再把2号变成
a*x1 - b*x2 <= y2 - z1
然后看到这个应该就要想到扩展欧几里德,若存在非负的且不都为0整数a,b,必定存在整数对 x,y使得 gcd(a,b) = a*x + b*y,
应用到这道题目上也就是 要求 gcd(x1,x2) = a*x1 + (- b*x2) 这个式子存在解,这个式子的值同一时候又是 z2 - y1所以实际上就是转化成了
gcd(x1,x2)与 z2 - y1得有整数倍的关系 ,意思就是 (z2-y1)%gcd(x1,x2) == 0。注意是取模。居然看到有篇题解写的是除号,做完想看看别人做法时看到这里坑了我一下,还以为我推的有问题呢,原来是他自己写错了,问题是居然另外有人的题解 直接复制了 他的解析,唉~~~~~
同一时候对于式子2我们也能够推到 (y2 - z1)%)gcd(x1,x2) == 0 这两个当中随意一个满足就可以,区间覆盖部分 不用严格包括,语文不太好说不清楚,反正留给自己长脑子的
题目给出了N组。N的范围为1000,直接扫两层暴力来推断就能够了。
我的推断是否整除部分是:
int cal(int a,int b,int c) {
if(c%a == 0 || b%a == 0)return 1;//不等式相等情况时的整除
return 0;
}
其它人的题解推断部分是:
bool isok(int t,int le,int ri)
{
int i,j;
if(le%t==0||ri%t==0) return true ;
if(le<0&&ri>=0) return true ;
if(ri/t-le/t>0) return true ;
return false ;
}
并且眼下为止我看到的网上的题解的 全部人的推断部分 如出一辙啊,全都是如上述所看到的的那样。可是我少了以下那两个if推断过了,是题目数据太水了吗,以下两个推断我还这么没搞懂,是我这个弱菜漏了什么吗。路过有大神请教指点啊,
#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set> #define ll long long #define eps 1e-8 #define inf 0xfffffff const ll INF = 1ll<<61; using namespace std; //vector<pair<int,int> > G;
//typedef pair<int,int > P;
//vector<pair<int,int> > ::iterator iter;
//
//map<ll,int >mp;
//map<ll,int >::iterator p; const int N = 1000 + 5; int x[N],y[N],z[N]; void init() {
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
memset(z,0,sizeof(z));
} int gcd(int a,int b) {
return b==0?a:gcd(b,a%b);
} int cal(int a,int b,int c) {
if(c%a == 0 || b%a == 0)return 1;//不等式相等情况时的整除
return 0;
} int main() {
int n;
while(scanf("%d",&n) == 1) {
init();
for(int i=0;i<n;i++)
scanf("%d %d %d",&x[i],&y[i],&z[i]);
bool flag = false;
for(int i=0;i<n;i++) {
for(int j=i + 1;j<n;j++) {
int tmp = gcd(x[i],x[j]);
if(cal(tmp,z[j] - y[i],y[j] - z[i])) {
flag = true;
}
}
}
if(flag)
puts("Cannot Take off");
else
puts("Can Take off");
}
return 0;
}
HDU4596 Yet another end of the world 扩展欧几里德性质的更多相关文章
- poj1061 青蛙的约会 扩展欧几里德的应用
这个题解得改一下,开始接触数论,这道题目一开始是看了别人的思路做的,后来我又继续以这种方法去做题,发现很困难,学长告诉我先看书,把各种词的定义看懂了,再好好学习,我做了几道朴素的欧几里德,尽管是小学生 ...
- (扩展欧几里德算法)zzuoj 10402: C.机器人
10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...
- [BZOJ1407][NOI2002]Savage(扩展欧几里德)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1407 分析: m,n范围都不大,所以可以考虑枚举 先枚举m,然后判定某个m行不行 某个 ...
- 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm
欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...
- 51nod 1352 扩展欧几里德
给出N个固定集合{1,N},{2,N-1},{3,N-2},...,{N-1,2},{N,1}.求出有多少个集合满足:第一个元素是A的倍数且第二个元素是B的倍数. 提示: 对于第二组测试数据,集合分别 ...
- CF 7C. Line(扩展欧几里德)
题目链接 AC了.经典问题,a*x+b*y+c = 0整数点,有些忘记了扩展欧几里德,复习一下. #include <cstdio> #include <iostream> # ...
- poj2142-The Balance(扩展欧几里德算法)
一,题意: 有两个类型的砝码,质量分别为a,b;现在要求称出质量为d的物品, 要用多少a砝码(x)和多少b砝码(y),使得(x+y)最小.(注意:砝码位置有左右之分). 二,思路: 1,砝码有左右位置 ...
- poj2115-C Looooops(扩展欧几里德算法)
本题和poj1061青蛙问题同属一类,都运用到扩展欧几里德算法,可以参考poj1061,解题思路步骤基本都一样.一,题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循 ...
- poj1061-青蛙的约会(扩展欧几里德算法)
一,题意: 两个青蛙在赤道上跳跃,走环路.起始位置分别为x,y. 每次跳跃距离分别为m,n.赤道长度为L.两青蛙跳跃方向与次数相同的情况下, 问两青蛙是否有方法跳跃到同一点.输出最少跳跃次数.二,思路 ...
随机推荐
- iOS 报错:(子线程中更新UI)This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes.
今天在写程序的时候,使用Xcode 运行工程时报出下面的错误错信息,我还以为是什么呢,好久没遇到过这样的错误了. **ProjectName[1512:778965] This application ...
- centos7 配置redis
文件上传 yum -y install lrzsz 安装redis部署前操作 同时下载redis-.tar.gz安装包 yum -y install gcc-c++ yum -y install tc ...
- react --- 路由传参的几种方式
1.params 优势 : 刷新地址栏,参数依然存在缺点:只能传字符串,并且,如果传的值太多的话,url会变得长而丑陋. 2.query 优势:传参优雅,传递参数可传对象:缺点:刷新地址栏,参数丢失 ...
- 联想服务器thinkserver TS550 Raid5制作及winserver2012R2 安装过来
一. 联想服务器thinkserver TS550 Raid5制作 1.开机后按ctrl+i 进入raid配置模式 2.选择“1”配置所需Raid模式(这次配的是raid5) 3.按提示确认后退出 ...
- highGUI图形用户界面
#include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> using namespace ...
- SQL Server存储ntext截断问题
SQL Server存储ntext截断问题 最近遇到一个问题:将大文本存储到数据库的时候,查询出来的文本却被截断了. 最后百度发现,作者提出 sql server management studi ...
- Ubuntu上使用过的命令,Linux常用命令,mount 硬盘挂载, ls 列表list命令,cp 复制copy命令,mkdir 创建文件夹 ,nano 编辑器,cat 文档合并,chmod 文件权限,ssh win10连接ubuntu服务器的步骤
man 帮助 > man ls # ubuntu的帮助 tar.gz 压缩解压 > tar -zcvf yzn.tar.gz /home/yzn # 压缩 > tar -zxvf y ...
- Redis序列化存储Java集合List等自定义类型
在"Redis学习总结和相关资料"http://blog.csdn.net/fansunion/article/details/49278209 这篇文章中,对Redis做了总体的 ...
- OpenJDK源码研究笔记(六)--观察者模式工具类(Observer和Observable)和应用示例
本文主要讲解OpenJDK观察者模式的2个工具类,java.util.Observer观察者接口,java.util.Observable被观察者基类. 然后,给出了一个常见的观察者应用示例. Obs ...
- 修改MySQL默认字符集
今天发现有库级字符集和表级字符集,实验了下发现,库级字符集是该库内表的默认字符集,当创建表时,如果未指定字符集,默认使用该表所属库的字符集.表也可使用不同于所属库的字符集. MySQL对于字符集的指定 ...