手动博客搬家: 本文发表于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. 传智播客C/C++学员荣膺微软&amp;Cocos 2d-x黑客松最佳创新奖

     6月30日,历时32小时的微软开放技术Cocos 2d-x 编程黑客松在北京望京微软大厦成功落下帷幕,这是微软开放技术首次联合Cocos 2d-x 在中国举办黑客松. 此次活动共同拥有包含传智播 ...

  2. lucene 范围过滤

    Lucene里面有关于Filter的整体知识 下面,我们来看下具体的在代码里怎么实现,先来看下我们的测试数据 Java代码    id      score       bookname    ena ...

  3. P1390--公约数的和

    这个题比较狗,一开始没有啥思路,但是看完题解觉得还是比较好理解的.主要思路就是需要把每个数是几个数的最大公约数求出来,然后求和就行了.蓝书P124例九 设f(n) = gcd(1,n) + gcd(2 ...

  4. AAC帧格式及编码介绍

    参考资料: AAC以adts格式封装的分析:http://wenku.baidu.com/view/45c755fd910ef12d2af9e74c.html aac编码介绍:http://wenku ...

  5. 89. Ext.Button 按钮

    转自:http://www.cnblogs.com/lipan/archive/2011/12/13/2274797.html 从本篇开始讲基础控件,ExtJs对所有的UI控件都有它自己的一套封装.本 ...

  6. NOIP 2015 DAY2

    跳石头 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块 ...

  7. Appium + python -小程序实例

    from appium import webdriverfrom appium.webdriver.common.touch_action import TouchActionfrom time im ...

  8. ubuntu Ngin Install

    安装gcc g++的依赖库 #apt-get install build-essential #apt-get install libtool 安装 pcre依赖库 #sudo apt-get upd ...

  9. HDU 4474 Yet Another Multiple Problem BFS

    题意:求m的倍数中不包含一些数码的最小倍数数码是多少.比如15 ,不包含0  1 3,答案是45. BFS过程:用b[]记录可用的数码.设一棵树,树根为-1.树根的孩子是所有可用的数码,孩子的孩子也是 ...

  10. ACM_螺旋填数

    螺旋填数 Time Limit: 2000/1000ms (Java/Others) Problem Description: 一天,小明在研究蜗牛的壳时,对其螺旋状的花纹感到十分有趣.于是他回到了家 ...