构造方程 (x + m * s) - (y + n * s) = k * l(k = 0, 1, 2,...)

变形为 (n-m) * s + k * l = x - y。即转化为模板题,a * x + b * y = n,是否存在整数解。

#include <iostream>

using namespace std;

#define LL long long

LL gcd(LL a, LL b)
{
    return b ? gcd(b, a%b) : a;
}

//find x, y that satisfied the equation ax+by=d, which minimize the {|x|+|y|}. ps:d = gcd(a,b).
void exgcd(LL a, LL b, LL &d, LL &x, LL &y)
{
    if (!b)
    {
        d = a, x = 1, y = 0;
    }
    else
    {
        exgcd(b, a %b, d, y, x);
        y -= x * (a / b);
    }
}
//1、先计算Gcd(a, b),若n不能被Gcd(a, b)整除,则方程无整数解;否则,在方程两边同时除以Gcd(a, b),得到新的不定方程a' * x + b' * y = n',此时Gcd(a', b')=1;
//2、利用上面所说的欧几里德算法求出方程a' * x + b' * y = 1的一组整数解x0, y0,则n' * x0,n' * y0是方程a' * x + b' * y = n'的一组整数解;
//3、根据数论中的相关定理,可得方程a' * x + b' * y = n'的所有整数解为:
//x = n' * x0 + b' * t
//y = n' * y0 - a' * t
//(t为整数)
bool getans(LL a, LL b, LL c, LL &ans)// ax + by = c 最小整数解
{
    LL r = gcd(a, b), y0;
    if (c%r)//no solutions
    {
        return false;
    }

a /= r, b /= r, c /= r;

exgcd(a, b, r, ans, y0);//至此,上面的说明解决了

LL t = c * ans / b;
    ans = c * ans - t * b;

/*此时方程的所有解为:x = c*ans - b*t, x的最小的可能值是0
    令x = 0可求出当x最小时的t的取值,但由于x = 0是可能的最小取值,实际上可能x根本取不到0
    那么由计算机的取整除法可知:由 t = c*k1 / b算出的t
    代回x = c*ans - b*t中,求出的x可能会小于0,此时令t = t + 1,求出的x必大于0;
    如果代回后x仍是大于等于0的,那么不需要再做修正。*/

if (ans < 0)
    {
        ans += b;
    }
    return true;
}

int main()
{
    LL x, y, m, n, L;
    while (cin >> x >> y >> m >> n >> L)
    {
        LL a = n - m, b = L, c = x - y;
        LL ans;
        bool flag = getans(a, b, c, ans);
        if (!flag)
        {
            cout << "Impossible" << endl;
            continue;
        }
        cout << ans << endl;
    }
}

poj1061的更多相关文章

  1. 欧几里德&扩展以及求解线性方程学习总结--附上poj1061解题报告

    欧几里德算法: 欧几里德就是辗转相除法,调用这个gcd(a,b)这个函数求解a,b的最大公约数 公式: gcd(a,b)=gcd(b,a%b):并且gcd(a,b)=gcd(b,a)=gcd(-a,b ...

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

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

  3. [POJ1845&POJ1061]扩展欧几里得应用两例

    扩展欧几里得是用于求解不定方程.线性同余方程和乘法逆元的常用算法. 下面是代码: function Euclid(a,b:int64;var x,y:int64):int64; var t:int64 ...

  4. POJ1061 青蛙的约会 —— 扩展gcd

    题目链接:https://vjudge.net/problem/POJ-1061 青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submi ...

  5. poj1061(扩展欧基里德定理)

    题目链接:https://vjudge.net/problem/POJ-1061 题意:在一个首位相接的坐标轴上,A.B开始时分别位于X,Y处,每个单位时间向右移动m,n米,问是否能相遇,坐标轴长L. ...

  6. POJ1061青蛙的约会[扩展欧几里得]

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 108911   Accepted: 21866 Descript ...

  7. 【poj1061】 青蛙的约会

    http://poj.org/problem?id=1061 (题目链接) 题意 两只青蛙在周长为L的球上沿一条直线向一个方向跳,每只每次分别跳m,n米,它们一开始分别在X,Y处,问跳几次两青蛙可以在 ...

  8. POJ1061 青蛙的约会

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

  9. poj1061 Exgcd

    #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> usin ...

  10. POJ1061 青蛙的约会-拓展欧几里得

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

随机推荐

  1. <转>ASP.NET学习笔记之理解MVC底层运行机制

    ASP.NET MVC架构与实战系列之一:理解MVC底层运行机制 今天,我将开启一个崭新的话题:ASP.NET MVC框架的探讨.首先,我们回顾一下ASP.NET Web Form技术与ASP.NET ...

  2. 浅谈Spring(一)

    一.Spring引言 Spring是一款轻量级框架,代码入侵量很小,并且还是众多优秀的设计模式的组合(工厂.代理.模板.策略). 特点: 1.方便解耦,简化开发 通过Spring提供的IoC容器,我们 ...

  3. 深度优先搜索——迷宫问题(华为oj)

    题目描述: 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, ...

  4. 查看SQLServer数据库信息的SQL语句

    --查看数据库中的表信息, --包括(表名,记录数,保留空间,使用空间,索引使用空间,未用空间) exec sp_MSForEachTable @precommand=N'create table # ...

  5. JQuery的Select操作集合

    jQuery获取Select选择的Text和Value:   语法解释: $("#select_id").change(function(){//code...}); //为Sel ...

  6. PHP学习(前言)

    PHP学习(前言) 都说做IT技术的都该写写博客,以前没写过,现在开始写写吧.不是给别人看,就当是自己的学习笔记了. 大三结束了,该找工作了,对web前端感兴趣,想从事前端工作,自然要会一门后台语言了 ...

  7. 美版nexus 5 LG D820才支持CDMA,国际版LG D821不支持

    我们都知道nexus 5其实是有两个不同的版本的,分别是LG D820和LG D821,它们在几乎所有的配置和外观上都没有任何的区别,主要区别在通讯模块上,一个支持GSM/CDMA/WCDMA/LTE ...

  8. Delphi 重启应用程序(创建Bat文件的Process)

    Delphi 重启应用程序在工程主文件中加入Delay(500); //启动程序时请延时一段时间,否则只能重启一次 procedure RestartApp; var BatchFile: TextF ...

  9. Codeforces 427D Match &amp; Catch(后缀自动机)

    [题目链接] http://codeforces.com/problemset/problem/427/D [题目大意] 给出一个两个字符串,求出最短且在两个字符串中唯一的公共子串. [题解] 以原字 ...

  10. C# ADO基础(使用using操作数据库)

    1.使用using 来对数据库进行操作,using是资源释放的一种缩写,用于实现了实现了IDisposable接口(释放对象资源的接口是IDisposable) private void button ...