POJ 1061 - 青蛙的约会 - [exgcd求解一元线性同余方程]
先上干货:
定理1:
如果d = gcd(a,b),则必能找到正的或负的整数k和l,使ax + by = d.
(参考exgcd:http://www.cnblogs.com/dilthey/p/6804137.html)
定理2:
一元线性同余方程ax ≡ n (mod b) 有解,当且仅当gcd(a,b)|n.

也就是说,解出了ax+by=gcd(a,b),就相当于解出了ax≡n(mod b) (而且只要满足gcd(a,b)|n,就一定有解)
定理3:
若gcd(a,b) = 1,则方程ax ≡ n (mod b)在[0, b-1]上有唯一解.
由上可知ax ≡ n (mod b) 即方程 ax + by = n,由定理1可知必然存在x,y满足 ax + by = gcd(a,b) = 1,则必然存在nx,ny满足 ax + by = n
则必然ax ≡ n (mod b)有解nx,由于nx+kb都是该方程的解,则在[0, b-1]上必然出现一个解。
再证唯一性:

唯一满足mod b = 0的条件的,只有x1 = x2
定理4:
若gcd(a, b) = d,则方程ax ≡ n (mod b)在[0, b/d - 1]上有唯一解.


这样,如果我有一个方程ax ≡ n (mod b)的任意解X,那么我先X mod (b/d),使得其在范围[-b/d+1,b/d-1]范围内,
再加上b/d就使其在范围[1,2(b/d)-1]范围内,再mod (b/d)就可以使其处在[0,b/d -1]范围内了。
即在[0,b/d-1]范围内的解x=[ X mod (b/d) + (b/d) ] mod (b/d).
分割线
然后正式关于题目:
题目链接:http://poj.org/problem?id=1061
题解:
青蛙A:a = ( x + mt ) mod L
青蛙B:b = ( y + nt ) mod L
现在要使得a=b,即( x + mt ) = ( y + nt ) (mod L),即( x - y ) + ( m - n ) t = kL;
即求最小的正整数t满足 ( m - n ) t + KL = y - x (K=-k),即求一元线性同余方程( m - n ) x ≡ ( y - x ) (mod L) 的解;
那么就像上面那样,先算( m - n ) * x + L * K = gcd( m - n , L ),得到一个x的值;
然后判断( y - x ) mod gcd( m - n , L ) == 0 ?,若能整除,则有解;
然后就只要先把x *= ( y - x ) / gcd( m - n , L ) ,再根据上面求出解集中的最小正整数即为答案;
PS.当然,最后一步求[0,b/d-1]范围内的唯一解时,由于要mod (b/d),我们要保证b/d为正,在本题中,即保证L/d为正,故d要为正。
AC代码:
#include<cstdio>
#include<algorithm>
typedef long long ll;
using namespace std;
ll x,y,m,n,L;
ll d,ans,K;
void exgcd(ll a,ll b,ll &d,ll &x,ll &y){
if(!b){d=a;x=;y=;}
else {exgcd(b,a%b,d,y,x);y-=(a/b)*x;}
}
int main()
{
scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&L);
if(m<n)
{
swap(m,n);
swap(x,y);
}
exgcd(m-n,L,d,ans,K);
if(d== || (x-y)%d!=) printf("Impossible\n");
else
{
ans*=(y-x)/d;
ans=(ans%(L/d)+(L/d))%(L/d);
printf("%I64d\n",ans);
}
}
PS.曾经刚开始搞ACM的时候,就因为这题是POJ第一页上为数不多的中文题而钻了很久,不过以当时的实力,想想就知道怎么磕都磕不出来的,今天总算把这道题给补上了,感觉还是不错的
POJ 1061 - 青蛙的约会 - [exgcd求解一元线性同余方程]的更多相关文章
- POJ 1061青蛙的约会。求解(x+mT)%L=(y+nT)%L的最小步数T。
因为是同余,所以就是(x+mT)%L-(y+nT)%L=0.可以写成(x-y+(m-n)T)%L=0.就是这个数是L的倍数啦.那么我可以这样x-y+(m-n)T + Ls = 0.就可以了,s可正可负 ...
- NEFU 84 - 五指山 - [exgcd求解一元线性同余方程]
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=84 Time Limit:1000ms Memory Limit ...
- poj 1061 青蛙的约会 拓展欧几里得模板
// poj 1061 青蛙的约会 拓展欧几里得模板 // 注意进行exgcd时,保证a,b是正数,最后的答案如果是负数,要加上一个膜 #include <cstdio> #include ...
- ACM: POJ 1061 青蛙的约会 -数论专题-扩展欧几里德
POJ 1061 青蛙的约会 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%lld & %llu Descr ...
- POJ.1061 青蛙的约会 (拓展欧几里得)
POJ.1061 青蛙的约会 (拓展欧几里得) 题意分析 我们设两只小青蛙每只都跳了X次,由于他们相遇,可以得出他们同余,则有: 代码总览 #include <iostream> #inc ...
- POJ 1061 青蛙的约会(exgcd)
嗯... 题目链接:http://poj.org/problem?id=1061 两只青蛙相遇时肯定满足:x+k*m≡y+k*n(mod L) x+k*m-(y+k*n)=L*s k*(n-m)-s* ...
- poj 1061 青蛙的约会 (扩展欧几里得模板)
青蛙的约会 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Status ...
- poj 1061青蛙的约会
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 90083 Accepted: 16257 Descripti ...
- POJ 1061 青蛙的约会 题解
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 139755 Accepted: 31803 Descript ...
随机推荐
- 【GIS】postgres(postgis) --》nodejs+express --》geojson --》leaflet
一.基本架构 1.数据存储层:PostgreSQL-9.2.13 + postgis_2_0_pg92 2.业务处理层:Nodejs + Express + PG驱动 3.前端展示层:Leaflet ...
- iOS开发-UIImageView响应点击事件
UIImageView是不能够响应点击事件的,在开发过程中我们需要经常对头像等添加点击事件,上网搜索一番后发现有如下两个方法: 1.找到点击图片Event,添加事件处理函数 UIImageView.u ...
- 利用DB实现简单去重处理
业务需要针对某文件进行判重操作,用Perl实现如下 #!/usr/bin/perl my %h; s/\s+$// and $h{$_}++ while <>; print "$ ...
- 【重要】攻击动作时间段判断~使用动画time比较动画length和使用一个变量数组做延迟
using UnityEngine; using System.Linq; using System.Collections.Generic; [RequireComponent(typeof(Cha ...
- JSP基本用法(二)隐含对象
一.摘要 在JSP容器中生成的Servlet类的_jspService()方法中,定义了几个对象,在编写JSP页面时我们可以使用这些隐含对象. PageContext pageContext = nu ...
- java远程连接access数据库
本文转载自http://www.voidcn.com/article/p-tlrtkqlp-k.html 1 rmijdbc远程连接access数据库 正常情况下,常用的数据库sql server, ...
- OpenCV——轮廓特征描述
检测出特定轮廓,可进一步对其特征进行描述,从而识别物体. 1. 如下函数,可以将轮廓以多种形式包围起来. // 轮廓表示为一个矩形 Rect r = boundingRect(Mat(contours ...
- 【PHP】 curl 上传文件 流
在运行过程中, 以下两种方式要看你的PHP 版本 'file' =>'@' .$filePath 'file' =>new CURLFile(realpath($filePath)) 本次 ...
- C++构造函数、new、delete
1. c++在调用构造函数时,才会把最开始的虚表指针指向虚表. 2.在构造函数或者析构函数中调用虚函数. 编译上没有问题. 运行时,调用虚函数不会发生多态行为,会调用正在构造的类的虚函数. 详细可见c ...
- css笔记 - transform学习笔记(二)
transform转换 CSS transform 属于2D/3D上的转换.变形效果.他不是一个动画,他就是变形.比如正方形变平行四边形,再变圆形.都是形状变成另一个形状. 但是如果配合上transi ...