因为是同余,所以就是(x+mT)%L-(y+nT)%L=0。可以写成(x-y+(m-n)T)%L=0。就是这个数是L的倍数啦。那么我可以这样x-y+(m-n)T + Ls = 0。就可以了,s可正可负,就能满足条件。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
LL gcd(LL n,LL m)
{
if (n%m==) return m;
else return gcd(m,n%m);
}
LL exgcd (LL a,LL mod,LL &x,LL &y)
{
//求解a关于mod的逆元
if (mod==)
{
x=;y=;
return a;//保留基本功能,返回最大公约数
}
LL g=exgcd(mod,a%mod,x,y);
LL t=x; //这里根据mod==0 return回来后,
x=y; //x,y是最新的值x2,y2,改变一下,这样赋值就是为了x1=y2
y=t-(a/mod)*y; // y1=x2(变成了t)-[a/mod]y2;
return g; //保留基本功能,返回最大公约数
}
LL get_min_number (LL a,LL b,LL c,LL &x,LL &y)
{
//得到a*x+b*y=c的最小整数解
LL abGCD = gcd(a,b);//系统gcd
if (c%abGCD != ) return -;//无解
a /= abGCD; b /= abGCD; c /= abGCD;
LL tx,ty;
exgcd(a,b,tx,ty); //先得到a*x+b*y=1的解,注意这个时候gcd(a,b)=1
x = tx*c; y = c*ty;//任意一个解,就是因为你求的是a*x+b*y=1的解,但是我们需要的是a*x+b*y=c的解,所以同时乘上c
//然后这个方程的解就是x0=tx*c+b*k,y0=ty*c-a*k。这里的a和b约简了的。k是{-1,-2,0,1,2}等
LL temp_x = x;
x %= b; if (x<=) x += b;//最小解
LL k = (temp_x-x)/b;
y += k*a;
return ;//1代表可以
}
void work ()
{
LL x,y,n,m,L;
cin>>x>>y>>m>>n>>L;
LL a=m-n;
LL b=L;
LL c=y-x;
LL tx,ty;
LL t = get_min_number(a,b,c,tx,ty);
if (t==-)
{
cout<<"Impossible"<<endl;
return ;
}
if (b<) b=-b;
while(tx<) tx += b;
cout<<tx<<endl;
return ; }
int main()
{
#ifdef local
freopen("data.txt","r",stdin);
#endif
work();
return ;
}

★、求解方程ax+by=c的最小整数解 (a或者b是负数的话,直接放进去也没问题)

首先就是如果要求解ax+by=c的话,用exgcd可以求到ax+by=1的x,y。那么我们首先把a和b约成互质的(除以gcd(a,b)即可),求到Ax+By=1的x和y后,但是我们要的是Ax+By=C的解,所以同时乘上C,这里的大写的字母是代表约去gcd(a,b)后的方程。然后这个方程的解就是x0=tx*C+B*k。y0=ty*C-A*k。k是{-1,-2,0,1,2}等。

int get_min_number (int a,int b,int c,int &x,int &y)    //得到a*x+b*y=c的最小整数解

{

int abGCD = gcd(a,b);

if (c%abGCD != 0) return -1;//无解

a /= abGCD; b /= abGCD; c /= abGCD;

int tx,ty;

exgcd(a,b,tx,ty); //先得到a*x+b*y=1的解,注意这个时候gcd(a,b)=1

x = tx*c;   y = c*ty; //同时乘上c,c是约简了的

int temp_x = x;

x %= b; if (x<=0) x += b;//最小解

int k = (temp_x-x)/b;

y += k*a;

return 1;//1代表可以

}

若要得到最小的正整数解。注意这里要先判定他们是否存在解,不然TLE

int bb=abs(b/gcd(a,b));

int aa=abs(a/gcd(a,b));

while(x<0) x += bb;

while(x*a+b*y!=c) y += aa;

POJ 1061青蛙的约会。求解(x+mT)%L=(y+nT)%L的最小步数T。的更多相关文章

  1. poj 1061 青蛙的约会 拓展欧几里得模板

    // poj 1061 青蛙的约会 拓展欧几里得模板 // 注意进行exgcd时,保证a,b是正数,最后的答案如果是负数,要加上一个膜 #include <cstdio> #include ...

  2. ACM: POJ 1061 青蛙的约会 -数论专题-扩展欧几里德

    POJ 1061 青蛙的约会 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%lld & %llu  Descr ...

  3. POJ.1061 青蛙的约会 (拓展欧几里得)

    POJ.1061 青蛙的约会 (拓展欧几里得) 题意分析 我们设两只小青蛙每只都跳了X次,由于他们相遇,可以得出他们同余,则有: 代码总览 #include <iostream> #inc ...

  4. POJ 1061 青蛙的约会【扩展欧几里德】

    设跳的次数为t 根据题意可得以下公式:(x+mt)%L=(y+nt)%L 变形得 (x+mt)-(y+nt)=kL (n-m)t+kL=x-y 令a=(n-m),b=L,c=x-y 得 at+bk=c ...

  5. POJ 1061 - 青蛙的约会 - [exgcd求解一元线性同余方程]

    先上干货: 定理1: 如果d = gcd(a,b),则必能找到正的或负的整数k和l,使ax + by = d. (参考exgcd:http://www.cnblogs.com/dilthey/p/68 ...

  6. poj 1061 青蛙的约会 (扩展欧几里得模板)

    青蛙的约会 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status ...

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

  8. POJ 1061青蛙的约会(拓展欧几里德算法)

    题目链接: 传送门 青蛙的约会 Time Limit: 1000MS     Memory Limit: 65536K Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见 ...

  9. Poj 1061 青蛙的约会(扩展GCD)

    题目链接:http://poj.org/problem?id=1061 解题报告:两只青蛙在地球的同一条纬度线上,选取一个点位坐标轴原点,所以现在他们都在同一个首尾相连的坐标轴上,那么他们现在的位置分 ...

随机推荐

  1. C# 表达式树(Expression)

    c#中有Expression,即表达式. 通过Expression可以动态构造代码,并编译执行.  比如: 1.  创建参数表达式 :ParameterExpression numParam = Ex ...

  2. 转载 : 10大H5前端框架

    原文作者: http://www.cnblogs.com/kingboy2008/p/5261771.html 作为一名做为在前端死缠烂打6年并且懒到不行的攻城士,这几年我还是阅过很多同门从知名到很知 ...

  3. 三、使用maven创建scala工程(scala和java混一起)

    本文先叙述如何配置eclipse中maven+scala的开发环境,之后,叙述如何实现spark的本地运行.最后,成功运行scala编写的spark程序. 刚开始我的eclipse+maven环境是配 ...

  4. java 正则表达式 验证邮箱

    import java.util.regex.Matcher; import java.util.regex.Pattern; public class demo1 { /**java正则表达式 * ...

  5. free查看内存情况

    free命令可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区. free [option]     -b:以Byte为单位显示内存使用情况:      -k:以KB为单位显 ...

  6. css 雪碧图

    CSS Sprites在国内很多人叫css精灵,是一种网页图片应用处理方式.它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来,当访问 该页面时,载入的图片就不会像以前那样一幅一幅地 ...

  7. Express的日志模块morgan

    morgan 是nodejs的一个日志模块,由 express 团队维护. 这里通过示例简要介绍morgan模块在express中的应用,大部分示例直接来自于.morgan的文档:https://gi ...

  8. Spring IOC 少

    控制反转好处 IOC:控制反转也叫依赖注入,IOC利用java反射机制,AOP利用代理模式.所谓控制反转是指,本来被调用者的实例是有调用者来创建的,这样的缺点是耦合性太强,IOC则是统一交给sprin ...

  9. Win10 上 安装Arduino 驱动 和 Arduino IDE 1.6.9

    Win10 安装Arduino IDE软件 和 驱动 在Win10 上安装最新的Arduino IDE (1.6.9安装包)很简单,并且不行要手动安装Arduino板子的驱动,整个安装过程都当前的简单 ...

  10. eclipse 远程操作HIVE

    首先启动HiveServer hive --service hiveserver 10000 & 创建工程 引入包: 代码(简单的查询): package com.hive.jdbc; imp ...