手动博客搬家: 本文发表于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即可。

部分易错点

  1. 很容易炸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 青蛙的约会 (扩展欧几里得算法)的更多相关文章

  1. 解题报告:poj1061 青蛙的约会 - 扩展欧几里得算法

    青蛙的约会 writer:pprp Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 119716 Accepted: 25238 ...

  2. POJ-1061 青蛙的约会---扩展欧几里得算法

    题目链接: https://cn.vjudge.net/problem/POJ-1061 题目大意: 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线 ...

  3. 解题报告:luogu P1516 青蛙的约会

    题目链接:P1516 青蛙的约会 考察拓欧与推式子\(qwq\). 题意翻译? 求满足 \[\begin{cases}md+x\equiv t\pmod{l}\\nd+y\equiv t\pmod{l ...

  4. [Luogu P1516]青蛙的约会

    按照题意,显然可以列出同余方程,k即为所求天数,再将其化为不定方程 ,那么对这个方程用扩展欧几里德算法即可得出k,q的一组解,但是方程有解的充要条件是(m – n) 和L不同时为零并且x – y是m ...

  5. luogu P1516 青蛙的约会(线性同余方程扩展欧几里德)

    题意 题解 做了这道题,发现扩欧快忘了. 根据题意可以很快地列出线性同余方程. 设跳了k次 x+mkΞy+nk(mod l) (m-n)kΞ-(x-y)(mod l) 然后化一下 (m-n)k+(x- ...

  6. [P1516]青蛙的约会 (扩展欧几里得/中国剩余定理?)

    每日做智推~ 一看就是一道数学题. 再看是一道公约数的题目. 标签是中国孙子定理. 题解是扩展欧几里得 (笑) 一开始没看数据范围 只有50分 开一个longlong就可以了 #include< ...

  7. POJ 1061 青蛙的约会(扩展欧几里得算法)

    http://poj.org/problem?id=1061 思路: 搞懂这个扩展欧几里得算法花了不少时间,数论真的是难啊. 含义:找出一对整数,使得ax+by=gcd(a,b). 接下来看这道题目, ...

  8. Poj 1061 青蛙的约会(扩展欧几里得解线性同余式)

    一.Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要 ...

  9. 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 ...

随机推荐

  1. HDU1010-奇偶剪枝(DFS)

    题目链接:Tempter of the Bone 第一次做剪枝的题目,剪枝,说实话研究的时间不短.好像没什么实质性的进展,遇到题目.绝对有会无从下手的感觉,剪枝越来越神奇了. .. . HDU1010 ...

  2. Ext.tree.Panel实现单选,多选

    Extjs var productCategoryTreeLookUpFn = function(callback) { var productCategoryLookUpWindow; var pr ...

  3. Python 网络爬虫与信息获取(二)—— 页面内容提取

    1. 获取超链接 python获取指定网页上所有超链接的方法 links = re.findall(b'"((http|ftp)s?://.*?)"', html) links = ...

  4. PCB 一键远程桌面+RDP文件生成

    最近在写个内网INCAM内网授权工具中,在服务端监听客户端请求后,后台自动处理客户端请求并远程客户端 这里记录3个点. 一.运行RDP文件后,正常会有下图2个弹窗,怎么可以关闭这2个弹窗呢, 通过模拟 ...

  5. html5小知识点

    1.兼容性问题: 对于不支持H5标签的浏览器,可以使用javascript来解决他们.然后在样式表中对这些标签定义一下默认的display:block. 采用第三方库:html5shiv.js < ...

  6. 引入外部CSS的两种方式及区别

    1.CSS的两种引入方式 通过@import指令引入 @import指令是CSS语言的一部分,使用时把这个指令添加到HTML的一个<style>标签中: 要与外部的CSS文件关联起来,得使 ...

  7. go package包的使用

    一.标准库 引入 在我们之前所写的所以代码中,我们基本上可以看到fmt这个导入的包,但是我们却不知道如何去写这种包. 如果我们可以自己去写,那么我们就可以将一个功能的集合统一的放入包中,便于以后使用, ...

  8. C# 导出word 表格代码

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  9. 微信公众号开发之文本消息自动回复,以及系统关注自动回复,php代码

    以tshop为例 直接上代码: 企业 cc_wx_sys表为自建,存储系统消息的配置的 字段: id type key status <?php /** * tpshop * ========= ...

  10. Linux安装java jdk、mysql、tomcat

    安装javajdk 1.8 检查是否安装 rpm -qa | grep jdk rpm方式安装 下载java1.8 jdk http://download.oracle.com/otn-pub/jav ...