手动博客搬家: 本文发表于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. 卸载完百度影音以后天气助手还在,而且总是自己主动打开ie浏览器,解决方式

    今天暴风影音不好用了.我就安装了百度影音,还有意外发现.相同的视频,用百度影音看不清楚,然后我就直接卸载了.结果卸掉以天气小助手还是在,而且总弹白色小框框,各种广告.最忍不了的是还自己主动打开ie浏览 ...

  2. android測试工具MonkeyRunner--google官网翻译

    近期在复习之前的笔记,在回想MonkeyRunner时看了看google官网的内容,写得不错.就翻译出来分享下.事实上google官网真是一个学习的好地方. 基础知识 MonkeyRunner工具提供 ...

  3. CodeForces 653 A. Bear and Three Balls——(IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2))

    传送门 A. Bear and Three Balls time limit per test 2 seconds memory limit per test 256 megabytes input ...

  4. luogu2157 [SDOI2009]学校食堂 局部状压

    题目大意 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数 ...

  5. hdu 2586(Tarjan 离线算法)

    How far away ?                                                                             Time Limi ...

  6. [BZOJ 1735] Muddy Fields

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1735 [算法] 二分图最小覆盖 [代码] #include<bits/stdc ...

  7. 75.培训管理-培训信息发布 Extjs 页面

    1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8&quo ...

  8. fsockopen get,post 封装 (转)

    function http_request($url, $method = 'GET', $postfields = NULL, $headers = array()) {   $parse = pa ...

  9. thinkphp的ip地址定位

    在WEB应用中,根据IP地址定位和记录相关访问日志也是非常常见的需求,在ThinkPHP中你可以轻松的实现IP地址获取和定位. 获取扩展类库 可以在官网的http://www.thinkphp.cn/ ...

  10. 题解报告:hdu 1847 Good Luck in CET-4 Everybody!(入门SG值)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1847 Problem Description 大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧 ...