Description

    追风的少年基XX为了赶上风速,他亲自打造了一个坐骑,他的坐骑拥有土豪级别的两个键帽,分别为加速按钮和减速按钮。那么问题来了,他每按一次加速按钮,可以给他的坐骑增加a的速度,每按一次减速按钮,他的坐骑速度会减少b,当速度减少到0的时候,不再减速,但依然可以继续按减速按钮。他坐骑现在的速度为s,但必须达到速度t(必须等于),才能赶上风的速度。还有个更严重的问题,他必须按n次按钮,不然他坐骑上的GTX1080战术核显卡是会BOOM的……基XX想知道,在不引爆显卡的情况下,能不能赶上风的速度。

Input

    输入一排,分别为描述中所叙述的n,s,t,a,b。其中1≤n≤109 0≤s,t≤109 1≤a,b≤109 

Output

    输出一行,如果基XX能赶上风的速度,输出“YES”,否则输出“BOOM”.
  • Sample Input
4 2 3 3 3
2 1 100 2 2

  • Sample Output
YES
BOOM

分析:

这个题目可以分为两种情况,

第一种就是在追逐过程中不会降到0,换句话意思就是说存在两个正整数x,y使得 ax+by= t-s 成立并且有 x + y = n,这样两个二元一次方程可以解出x,y如果有整数解,那么说明YES,否则判断第二种情况。

第二种就是在追逐过程中会先降到0,然后再0的时候继续反复减速(也可以不继续减速)然后再加速到 t,这样的情况我们就分为前后两段,第一段是减速到0,很显然这一个过程至少需要 sub(s/b) 次。sub(a)表示对a向上取整。因为速度减为0之后我们可以反复0处通过减速来浪费次数,所以我们要在n - sub(s/b) 次数内 从0上升到t.这样题目就转化为为.

ax+by = t, 并且 x>=0 && y>=0 求x+y的最小值,如果x+y的最小值 小于 n - sub(s/b) 就说明YES,否则就NO. 这里因为 t 的范围很大所以要使用拓展欧几里得来求解。循环判断要超时。

ax+by = t 显然 t % gcd(a,b) == 0 才有解。令 t / gcd = c . 那么 求得一组特殊解 x0a + y0b = gcd .那么 cx0 ,cy0 就是 ax+by = t 的一组特解。那么通解是什么呢?

x = cx0 + b/gcd * m

y = cy0 - a/gcd * m

然后就可以用这两个式子来求得x,y。

代码:

#include <stdio.h>
#include <string.h>long long MAX(long long a,long long b)
{return a>b?a:b;
}
long long MIN(long long a,long long b)
{return a<b?a:b;
}long long e_gcd(long long a,long long b,long long &x,long long &y)
{if(b == 0){x = 1;y = 0;return a;}long long ans = e_gcd(b,a%b,y,x);y = y - a/b*x;return ans;
}
bool tz_gcd(long long a,long long b,long long c,long long& x,long long& y)
{long long gcd;gcd = e_gcd(a,b,x,y);if(c % gcd != 0){return false;}else{x = c / gcd * x;y = c / gcd * y;if( x > 0 && y < 0 ){long long t = 0;t = x / (b/gcd);t = MIN(t,-y/(a/gcd));x = x - b/gcd * t;y = y + a/gcd * t;}else{long long t = 0;if( x < 0){if( (-x * gcd) % b == 0) t = (-x*gcd)/b;else t = (-x * gcd)/b + 1;}if( y > 0){if( (y * gcd) % a == 0 ) t = MAX(t,(y*gcd)/a);else t = MAX(t,(y*gcd)/a+1);}x = x + b/gcd * t;y = y - a/gcd * t;}}return true;
}bool Jianjie(long long n,long long s,long long t,long long a,long long b)
{long long c;if( s % b == 0) c = s / b;else c = s / b + 1;long long x,y;if(!tz_gcd(a,b,t,x,y)) return false;y = -y;if( c + x + y <= n) return true;return false;
}int main()
{long long n,s,t,a,b;while(scanf("%lld%lld%lld%lld%lld",&n,&s,&t,&a,&b)!=EOF){if((t + n * b - s) % (a+b) == 0){printf("YES\n");continue;}if(Jianjie(n,s,t,a,b)){printf("YES\n");continue;}printf("BOOM\n");}return 0;
}

扩展欧几里得___追风少年的坐骑(2016swust信息院赛)相关推荐

  1. 扩展欧几里得 POJ 1061

    感觉这道题目的数据好水啊...我的代码我都觉得姿势特别奇怪...竟然还过了... 好吧,原来不是姿势奇怪,而是逆元需要用的时候是余数也需要的时候,这里的余数是不需要的,所以就AC了 就说一下碰到的问题 ...

  2. 求逆元(线性求逆元)及其扩展欧几里得

    线性求逆元模板: int inv[maxn]; void initInverse(){inv[1] = 1;for(int i = 2; i <= maxn; i++)inv[i] = (p - ...

  3. poj-青蛙的约会(扩展欧几里得)nyoj-小柯的约会

    由题意可列出方程 x + m * s - (y + n * s) = k * l; 化简得   (n-m)*s + k*l = x - y 化简得   (n-m)*s = x - y (mod l); ...

  4. [模板]欧几里得算法/扩展欧几里得

    最大公因数(欧几里得算法) $gcd(a,b)=gcd(b\%a,a)$(不一定需要a<b) $gcd(0,b)=b$ 1 inline int gcd(int a,int b){ 2 retu ...

  5. “景驰科技杯”2018年华南理工大学程序设计竞赛 H-对称与反对称(扩展欧几里得求逆元)

    题目链接 题目描述: 给出一个N*N的方阵A.构造方阵B,C: 使得A = B + C.其中 B为对称矩阵,C为反对称矩阵. 对于方阵S中的任意元素,若(S)ij = (S)ji,则称S为对称矩阵 对 ...

  6. Strange Optimization(扩展欧几里得)

    Strange Optimization Accepted : 67   Submit : 289 Time Limit : 1000 MS   Memory Limit : 65536 KB Str ...

  7. CodeForces - 724C Ray Tracing(扩展欧几里得解方程)

    题目链接:点击查看 题目大意:在 n∗mn*mn∗m 的矩阵中,从点 (0,0)(0,0)(0,0) 发射一个小球,以四十五度的方向出发,速度是 2\sqrt{2}2​,当碰到壁时,会进行反射:当碰到 ...

  8. 牛客多校3 - Fraction Construction Problem(扩展欧几里得)

    题目链接:点击查看 题目大意:给出 a 和 b ,求解满足条件的 c,d,e,f ,使得: d < b f < b c,e 均为小于等于 4e12 的正整数 题目分析:分情况讨论一下,首先 ...

  9. POJ - 1061 青蛙的约会(扩展欧几里得)

    题目链接:点击查看 题目大意:两只青蛙在一个单向循环数轴上跳动,给出初始位置和每秒跳动的距离以及数轴长度,问是否可以相遇,若能相遇求出最小时间 题目分析:自从第一次接触扩展欧几里得以来已经有半年时间了 ...

  10. POJ - 2142 The Balance(扩展欧几里得)

    题目链接:点击查看 题目大意:给出两种重量的砝码,我们需要利用天平称出指定重量的药物,我们需要求出这两种砝码各自的数量,使得砝码数量之和最小 题目分析:我们可以先列出关系式,假设两个砝码的重量分别为a ...

最新文章

  1. Jenkins配置MSBuild实现自动部署(MSBuild+SVN/Subversion+FTP+BAT)
  2. Oracle Data Guard 理论知识
  3. 命令行参数tail c语言,osg学习笔记2, 命令行参数解析器ArgumentParser
  4. apache站点优化—静态缓存
  5. 推荐两个检索和分类小工具Carrot2 OSS
  6. MySQL 表一列逗号分隔字段,按逗号切割
  7. 武大计算机几天出录取结果,录取大概要几天 多久录取结果出来
  8. 挑战程序员同学,如何只用2GB内存从20/40/80亿个整数中找到出现次数最多的数?
  9. 《现代操作系统(中文第四版)》课后习题答案 第一章 引论
  10. vue项目使用i18n插件实现多语言切换功能
  11. 操作系统学习笔记02【进程控制——进程互斥的硬件实现方法】【自用】
  12. 【乐理】常用和弦走向(4536251/1645)
  13. sqlmap之tamper脚本
  14. 机器学习_深度学习毕设题目汇总——人脸B
  15. 基于Pytorch实现的流式与非流式语音识别
  16. android app自动锁屏,Android开机自动启动app 不锁屏
  17. html边框环绕一周动画,环绕式CSS边框动画
  18. 国外期刊发表文章时一定用到的SCI论文写法攻略
  19. 排序算法(不定时更新~)
  20. Typora+Git+Gitee实现个人笔记自动同步

热门文章

  1. 【异常检测】【SPADE】论文简单梳理与代码实现
  2. 星期几计算函数参考 周几计算 礼拜几计算函数 C语言 C++函数参考 用公式计算 通用函数 Linux开发函数 Windows开发函数参考
  3. computed 和 watch的区别
  4. Java为PDF文档加密
  5. java的listroots_Java File listRoots()用法及代码示例
  6. help指令和man指令的区别
  7. iOS设置基于ikev2的协议连接企业虚拟专用网络
  8. ZYNQ芯片软硬件协同开发二:最简Linux操作系统的硬件部分设计
  9. Mac电脑截图卡屏了怎么办?
  10. 夕甲甲——孔乙己之C++版