POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法)
手动博客搬家: 本文发表于20180226 23:35:26, 原地址https://blog.csdn.net/suncongbo/article/details/79382991
题目链接: (poj)http://poj.org/problem?id=1061
(bzoj)http://www.lydsy.com/JudgeOnline/problem.php?id=1477
(Luogu)https://www.luogu.org/problemnew/show/P1516
数据强度对比: 在以上三个OJ中,本题Luogu数据最强。使用一种错误代码在BZOJ与POJ均能AC,而Luogu无法AC.
题目大意:
求解方程$$u+mx\equiv v+nx (\mod p)$$注意这里的u,v,m,n,p分别对应题目中的x,y,n,m,L.
思路分析:
解同余方程?很经典的使用exgcd算法的问题。(简单一点的exgcd解同余方程的题目可参照luogu P1082 NOIP 2012 D2 T1 同余方程,题目链接https://www.luogu.org/problem/show?pid=1082)
一般来说,如果是形如\(ax\equiv c(\mod b)\)的同余方程都可化为\(ax+by=c\)的形式,用exgcd算法求解后\(x\)的值即为原方程的解。
所以直接化一化式子即可: $$u+mx\equiv v+nx(\mod p)$$$$u+mx-v-nx\equiv 0(\mod p)$$$$(m-n)x\equiv v-u(\mod p)$$代入上面的公式,令\(a=m-n, c=v-u, b=p\)可得答案即为不定方程$$(m-n)x+py=v-u$$的所有解中x最小且为整数的解的x值.
注意讨论正数与负数的情况。现假设\(m>n\).
如果\(\gcd(m-n,p)\)不整除\(|v-u|\)(注意v不一定大于u), 则无解
否则直接exgcd即可。求出$$(m-n)x+py=gcd(m-n,p)$$的一组解,乘以\(\frac{v-u}{gcd(m-n,p)}\)(注意不加绝对值)即可. 于是我们求出了特解。
如何求x>0且最小的解呢? 我们发现若\(ax+by=c\)特解为\(x=x_0, y=y_0\)则通解为\(x=x_0+\frac{b}{gcd(a,b)}t, y=y_0-\frac{a}{gcd(a,b)}t\)(t取任意整数)(一定注意不要忘记除以gcd!!!)因此在数学上对\(\frac{b}{gcd(a,b)}\)取模即可。
注意此处“在数学上”\(A \mod B\)是指\(A\equiv X (\mod B)\)且\(0\le X\lt b\)的唯一的X, 但是在C++语言编程中不能这样取模,C++中负数取模的含义是
(-A) % B == -(A % B) (A>0,B>0)
例如
(-6) % 5 = -1
(-7) % 4 = -3
(-18) % 9 = 0
其返回值\(x\)满足\(-B\lt x\le 0\)
因此在数学上负整数\(-A\)对正整数\(B\)取模,就相当于在C++语言中的
(((-A)%B)+B)%B
(注: 以上关于取模的分析过程均采用大写,关于不定方程的分析过程均采用小写)
代入\(-A=x_0, B=\frac{b}{gcd(a,b)}\)即可,再将a,b分别换成原方程中的\(m-n\)和\(p\),直接畅通无阻地使用exgcd即可。
部分易错点
- 很容易炸long long, 一定注意。
 
代码实现
(三个OJ均AC)
#include<cstdio>
#include<algorithm>
using namespace std;
long long u,v,m,n,p;
long long exgcd(long long a,long long b,long long &x,long long &y)
{
	if(b==0ll) {x = 1ll; y = 0ll; return a;}
	long long ret = exgcd(b,a%b,y,x); y -= a/b*x;
	return ret;
}
long long gcd(long long a,long long b)
{
	if(b==0ll) return a;
	else return gcd(b,a%b);
}
long long absl(long long x)
{
	return x>0ll ? x : -x;
}
void swap_ll(long long &x,long long &y)
{
	long long c = x; x = y; y = c;
}
int main()
{
	scanf("%lld%lld%lld%lld%lld",&u,&v,&m,&n,&p);
	long long x,y;
	if(m==n) {puts("Impossible"); return 0;}
	if(m-n<0) {swap_ll(u,v); swap_ll(m,n);}
	if(absl(v-u)%gcd(m-n,p)!=0) {puts("Impossible"); return 0;}
	exgcd(m-n,p,x,y);
	long long s = x*((v-u)/gcd(m-n,p)); //此处一定是用(v-u)/gcd(m-n,p),x不一定被gcd整除
	long long g = p/gcd(m-n,p); //把g直接当成了p使用,在BZOJ和POJ居然AC,所幸Luogu WA
	s = ((s%g)+g)%g;
	printf("%lld\n",s);
	return 0;
}
												
											POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法)的更多相关文章
- 解题报告:poj1061 青蛙的约会 - 扩展欧几里得算法
		
青蛙的约会 writer:pprp Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 119716 Accepted: 25238 ...
 - POJ-1061 青蛙的约会---扩展欧几里得算法
		
题目链接: https://cn.vjudge.net/problem/POJ-1061 题目大意: 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线 ...
 - 解题报告:luogu P1516 青蛙的约会
		
题目链接:P1516 青蛙的约会 考察拓欧与推式子\(qwq\). 题意翻译? 求满足 \[\begin{cases}md+x\equiv t\pmod{l}\\nd+y\equiv t\pmod{l ...
 - [Luogu P1516]青蛙的约会
		
按照题意,显然可以列出同余方程,k即为所求天数,再将其化为不定方程 ,那么对这个方程用扩展欧几里德算法即可得出k,q的一组解,但是方程有解的充要条件是(m – n) 和L不同时为零并且x – y是m ...
 - luogu P1516 青蛙的约会(线性同余方程扩展欧几里德)
		
题意 题解 做了这道题,发现扩欧快忘了. 根据题意可以很快地列出线性同余方程. 设跳了k次 x+mkΞy+nk(mod l) (m-n)kΞ-(x-y)(mod l) 然后化一下 (m-n)k+(x- ...
 - [P1516]青蛙的约会 (扩展欧几里得/中国剩余定理?)
		
每日做智推~ 一看就是一道数学题. 再看是一道公约数的题目. 标签是中国孙子定理. 题解是扩展欧几里得 (笑) 一开始没看数据范围 只有50分 开一个longlong就可以了 #include< ...
 - POJ 1061 青蛙的约会(扩展欧几里得算法)
		
http://poj.org/problem?id=1061 思路: 搞懂这个扩展欧几里得算法花了不少时间,数论真的是难啊. 含义:找出一对整数,使得ax+by=gcd(a,b). 接下来看这道题目, ...
 - Poj 1061 青蛙的约会(扩展欧几里得解线性同余式)
		
一.Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要 ...
 - P1516 青蛙的约会
		
P1516 青蛙的约会x+mt-p1L=y+nt-p2L(m-n)t+L(p2-p1)=y-x令p=p2-p1(m-n)t+Lp=y-x然后套扩欧就完事了 #include<iostream&g ...
 
随机推荐
- oracle Plsql 运行update或者delete时卡死问题解决的方法
			
oracle Plsql 运行update或者delete时 遇到过Plsql卡死问题或者导致代码运行sql的时候就卡死. 在开发中遇到此问题的时候,本来把sql复制出来,在plsql中运行,Sql本 ...
 - 在android系统调试中使用tinyalsa命令【转】
			
本文转载自:http://blog.csdn.net/tangdexi112/article/details/17579021 我们在进行音频调试的时候,需要使用tinymix.tinyplay.ti ...
 - Android WiFi开发教程(三)——WiFi热点数据传输
			
在上一篇文章中介绍了WiFi的搜索和连接,如果你还没阅读过,建议先阅读上一篇Android WiFi开发教程(二)——WiFi的搜索和连接.本篇接着简单介绍手机上如何通过WiFi热点进行数据传输. 跟 ...
 - hdu1150——最小点覆盖
			
As we all know, machine scheduling is a very classical problem in computer science and has been stud ...
 - B3680 吊打xxx 物理???
			
看到一道很有意思的题,这个题简直有毒,是一道物理题...好像得用模拟退火...但显然我太弱了不会模拟退火,只能用正交分解暴力... 每次沿着力的方向走一定的距离,假如转头了,则走的步长就减小一点. 不 ...
 - 如何通过免费开源ERP Odoo实现企业数字化转型深度分析(一)
			
本文来自<开源智造企业数字化转型报告白皮书>的精选内容章节.请勿转载.欢迎您反馈阅读意见. 引言 在由消费者驱动的数字经济时代,创新之势锐不可挡.变革步伐从未如此迅速,并且还会越来越快.对 ...
 - BZOJ 4565 状压DP
			
思路: f[i][j][S]表示从i到j压成S状态 j-m是k-1的倍数 $f[i][j][S<<1]=max(f[i][j][S<<1],f[i][m-1][S]+f[m][ ...
 - office 2010 破解
			
使用Rearm命令激活延迟重置Office 20101.安装Offcie 2010 安装Offcie 2010,默认30天的试用期,这里要注意,上文提供的Office 2010是零售版,所以没有序列号 ...
 - JQuery  兼容所有浏览器的复制到剪切板功能
			
灵机一动想的点子,应该不难理解 <textarea onmousedown='selectAll(this);'>11111</textarea> function selec ...
 - Last-Modified   If-Modified-Since     ETag    If-None-Match
			
Last-Modified.If-Modified-Since 有些数据随时都在变化. CNN.com 的主页经常几分钟就更新.另一方面,Google.com 的主页几个星期才更新一次 (当他们上传特 ...