手动博客搬家: 本文发表于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. luogu1726 上白泽慧音

    题目大意 求一个有向图含节点数最多且结点编号从小到大排列字典序最小的强连通分量. 注意事项 HDU1269那道题题面.数据太弱,在这道题上把我害惨了... Dfs点u时,如果与u相连的一个点v有Dfs ...

  2. Ubuntu Linux 安装 .7z 解压和压缩文件

    安装方法: sudo apt-get install p7zip 解压文件: 7z x manager.7z -r -o /home/xx解释如下:x 代表解压缩文件,并且是按原始目录解压(还有个参数 ...

  3. Android入门之文件系统操作(二)文件操作相关指令

    (一)获取总根 File[] fileList=File.listRoots(); //返回fileList.length为1 //fileList.getAbsolutePath()为"/ ...

  4. bzoj1231 [Usaco2008 Nov]mixup2 混乱的奶牛——状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1231 小型状压DP: f[i][j] 表示状态为 j ,最后一个奶牛是 i 的方案数: 所以 ...

  5. simpleOS 1.0

    做了一个so simple的OS,本不好意思多说的....不过还是说下吧. 首先,买不起开发板的我没有办完完成一件事,那就是保存任务上下文,因为这个过程实际上是将寄存器的值存放到任务堆栈中去的. 而要 ...

  6. codevs1253 超级市场(dp)

    1253 超级市场  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description 某人喜欢按照自己的规则去市场买菜,他每天 ...

  7. Python 36 死锁现象和递归锁、信号量、Event事件、线程queue

    一:死锁现象和递归锁 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远 ...

  8. HBase的集群搭建(1、3、5节点都适用)

    见 5 hbase-shell + hbase的java api

  9. ASP.NET MVC + 工厂模式 + 三层 + 缓存

    最近将手头的项目总结整理了一下,以方便自己的学习.... 下面直接上图先介绍项目的结构图: 项目是ASP.NET MVC 4.0的应用程序,DBUtility这个类库主要是DbHelper操作数据库的 ...

  10. web前端利用HTML代码显示符号

    HTML常用符号代码:                       ´ ´ © © > > µ µ ® ® & & ° ° ¡ ¡     » » ¦ ¦ ÷ ÷ ¿ ¿ ...