H-大时钟(扩展欧几里得)
链接:https://ac.nowcoder.com/acm/contest/635/H
来源:牛客网
题目描述
艾兰岛和沃夫岛的时间算法很不一样,它们都拥有它们自己的魔法大时钟。以我们的时间来看艾兰岛的大时钟起鸣在b, b+a, b+2a, b+3a,… ,(a,b均为正整数)并且沃夫岛的大时钟起鸣在d, d+c, d+2c, d+3c,….(c,d均为正整数)因为计时的方法不同,两边经常打仗,但可能有某些时间点两边的大时钟同时起鸣。我们称这样的时间点为和平点。求第一个和平点。(如果没有这样的时间点,输出-1)
输入描述:
第一行输入两个整数a,b ( 1< a,b < 5*108)
第二行输入两个整数c,d ( 1< c,d < 5*108)
输出描述:
第一个和平点所表示的时间(如果没有这样的时间点,输出-1)
输入
复制
20 2 9 19
输出
复制
82
输入
2 1 16 12
输出
-1 思路:保证 ax+b=cy+d 最小,等式转化成 ax-cy=d-b(x>0,y>0),即ax+cy=d-b(x>0,y<0),为了使方程具有统一性,我们要确保d-b>0,或者d-b<0(这里是d-b>0)显然是扩展欧几里得的应用,我们用扩展欧几里得算出 ax+cy=gcd(a,c) 根据扩展欧几里得性质,当d-b整除gcd才有解。再乘以(b-d)/gcd(a,c),就是ax+cy=d-b的一个解。因为我们固定d-b>0,所以我们要先求得最大负数的一个y解,为什么不是算x解。 因为 ax+b=d-cy(d>b,y<0),如果计算最小正数解是不能保证d-cy等于ax+b的,有可能d-cy达不到ax+b那么小,因为d>b, -cy>0举例: a=1,x=1,b=2,d=4, a*x+b=3<d-cy>4,所以是不行的。就是 如果算x的最小正解 ax+b太小 可能使 cy+d y为负数(就不符合题意了)所以求到最大负数y解即可,保证有解。代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<map> #define inf 0x3f3f3f3f using namespace std; typedef long long ll;ll exgcd(ll a,ll b,ll &x,ll &y) {if(b==0){x=1;y=0;return a;}int ans=exgcd(b,a%b,x,y);int temp=x;x=y;y=temp-(a/b)*y;return ans; } int main() {ll a,b,c,d,x,y;cin>>a>>b>>c>>d;if(b>d)//保证d>b {swap(a,c);swap(b,d);}ll g=exgcd(a,c,x,y);if((d-b)%g!=0)//d-b整除gcd才有解 cout<<-1<<endl;else{x=x*(d-b)/g;y=y*(d-b)/g;y%=(a/g);if(y>0)//求是最大负数y解 y-=a/g;cout<<d-c*y<<endl;}return 0; }
转载于:https://www.cnblogs.com/xiongtao/p/10702043.html
H-大时钟(扩展欧几里得)相关推荐
- 数论一之定理证明——裴蜀/威尔逊/费马/扩展欧几里得/[扩展]欧拉/[扩展]中国剩余定理,欧拉函数,逆元,剩余系,筛法
打死没想到会在H老师处学懂数论 同余,整除 模运算 埃式筛法 欧拉筛法 最大公约数和最小公倍数 辗转相除法 更相减损术 裴蜀定理 威尔逊定理 费马定理 同余等价类.剩余系.缩系 欧拉函数 欧拉定理 扩 ...
- 欧几里得+扩展欧几里得+RSA
欧几里得算法: 就是辗转相除法,gcd(a,b)=gcd(b,a%b), 实现简单,用途广泛,模板如下: int gcd(int a,int b)//或者都取 long long {return b! ...
- “景驰科技杯”2018年华南理工大学程序设计竞赛 H-对称与反对称(扩展欧几里得求逆元)
题目链接 题目描述: 给出一个N*N的方阵A.构造方阵B,C: 使得A = B + C.其中 B为对称矩阵,C为反对称矩阵. 对于方阵S中的任意元素,若(S)ij = (S)ji,则称S为对称矩阵 对 ...
- Strange Optimization(扩展欧几里得)
Strange Optimization Accepted : 67 Submit : 289 Time Limit : 1000 MS Memory Limit : 65536 KB Str ...
- 逆元+费马小定理+扩展欧几里得
逆元:(即是逆元素)逆元素是指一个可以取消另一给定元素运算的元素. 在一个代数系统(S,*)中,存在单位元素e,如果对S内的元素a存在a^-1 * a = e,则将 a^-1称为a 的左逆元. 同理若 ...
- URAL1204. Idempotents(扩展欧几里得)
1204 大体推推 会出来这个式子 x(x-1) = k*n;n = p*q ;x(x-1)%(p*q)==0; 因为p,q都为素数 那也就是说x和x-1中必定包含这两个数 而且一个里面只能有一个 不 ...
- Romantic 扩展欧几里得
romantic 扩展欧几里得 #include<bits/stdc++.h> using namespace std; typedef long long ll; ll exgcd(ll ...
- 【笔记】 欧几里得(扩展欧几里得)
欧几里得 本质:利用辗转相减法求最大公约数,即 gcd(a, b). 数学表达: 设 a > b ,则 gcd(a, b) = gcd(a-b, ...
- 欧几里得算法扩展欧几里得
本文包括: 1.几里德算法 递归实现 2.扩展欧几里德算法 递归实现 -实际上就是把别人总结的,我认为有助于自己理解的内容copy过来,再加上几句自己的理解. 欧几里得算法 欧几里德算法又称辗转相除法 ...
- 扩展欧几里得求多组解CodeForces - 1244C
扩展欧几里得求多组解 扩展欧几里得可以求得满足ax+by = c的一组解(这里c%gcd(a,b)要等于0):假如求得的解为(x0 , y0),G = gcd(a , b),这时我们可以发现(x0 + ...
最新文章
- linux out of memory分析(OOM)
- oracle sequence用法
- 嵌入式系统中对汉字的处理
- SetupDiGetClassDevs函数详解
- 制作Python的安装模块
- 1、打印二进制机器码,程序内存分析,大端序小端序,指针数组,数组指针,数组的三种访问方式,typedef,#if-0-#endif,求数组大小,括号表达式
- Careless Me
- weekendplan
- asp.net基础知识
- 计算机英语短文互译,中英文互译的英语短文
- 操作系统原理 —— 操作系统概述
- 改caffe 里面的contrsitve_loss
- 序列化---fastjson使用
- 在mybatis里面取别名
- mysql报错:Host ***.***.***.*** is not allowed to connect to this MySQL server
- 前端对页面中的 checked 选中状态的展示
- 作为一位爬虫,说说代理IP哪家强?
- 汽车之家精选论坛图片下载
- 举个栗子!Tableau 技巧(158):如何实现双域的服务器单点登录
- php程序克隆,php克隆 - freedom - OSCHINA - 中文开源技术交流社区
热门文章
- matlab条形图标注数据,matlab条形图怎样标注
- RPA之家视频讲解RPA-3
- 一句话理解:过拟合和欠拟合
- 鸡蛋,必须放在合适的篮子里
- 我的世界玩服务器虚拟内存高崩,服务端崩溃 - 崩溃解答 - MC百科社群 - MC百科|最大的Minecraft中文MOD百科...
- springboot2 集成支付宝支付
- linux没有cpufreq目录,Linux系统的Cpufreq
- java-net-php-python-java门诊信息管理系统计算机毕业设计程序
- Handler同步屏障
- MLO/uboot-spl.bin和uboot.img/uboot.bin