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.两青蛙跳跃方向与次数相同的情况下, 问两青蛙是否有方法跳跃到同一点.输出最少跳跃次数.二,思路 ...
随机推荐
- Zepto源代码分析之二~三个API
因为时间关系:本次仅仅对这三个API($.camelCase.$.contains.$.each)方法进行分析 第一个方法变量转驼峰:$.camelCase('hello-world-welcome' ...
- Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD
Build.VERSION.SDK_INT是系统的版本,Build.VERSION_CODES.GINGERBREAD是版本号. 到VERSION.SDK_INT不禁诧异,这是何物?! 看API的定义 ...
- thinkphp命名空间
thinkphp命名空间 总结 1.只对函数,类,及const定义的常量有效,对define定义的常量无效 2.如果函数不是为了使用,那有什么意义呢 3.ThinkPHP将命名空间转化为了路径,比如n ...
- OpenGL编程逐步深入(八)伸缩变换
准备知识 伸缩变换非常简单,它的目的是增大或者缩小对象的尺寸.例如:你可能希望用同一个模型创建不同大小的对象(例如形状相同,但大小不同的树木)或者你想改变对象的大小使它和游戏场景匹配.这些例子中你可能 ...
- js实现观察者模式风格替换
如下图,我们看到两种风格:在选择男士时,页面颜色为黑色:在选择女士时,页面颜色为粉红色. 主要可以分为两类: 下拉框 ---> 被观察者 div ---> 观察者 面向过程实现风格替换: ...
- file_get_contents 无法采集 https 网站
<?php echo file_get_contents("https://www.baidu.com"); ?> 运行以上代码会报以下错误: 再运行一次去看看!
- 对比学习:《深度学习之Pytorch》《PyTorch深度学习实战》+代码
PyTorch是一个基于Python的深度学习平台,该平台简单易用上手快,从计算机视觉.自然语言处理再到强化学习,PyTorch的功能强大,支持PyTorch的工具包有用于自然语言处理的Allen N ...
- PKI 信息安全三大特性
[机密性]发送方 接收方明文 M ...
- 【Henu ACM Round#19 B】 Luxurious Houses
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 从右往左维护最大值. 看到比最大值小(或等于)的话.就递增到比最大值大1就好. [代码] #include <bits/std ...
- HDU 5373(2015多校7)-The shortest problem(模拟%11)
题目地址:pid=5373">HDU 5373 题意:给你一个数n和操作次数t,每次操作将n的各位数之和求出来放在n的末尾形成新的n,问t次操作后得到的n能否够被11整除. 思路:就是 ...