扩展欧几里德 poj1061 青蛙的约会

扩展欧几里德很经典。可是也有时候挺难用的。一些东西一下子想不明确。。

于是来了一个逆天模板。。仅仅要能列出Ax+By=C。就能解出x>=bound的一组解了~

LL exgcd(LL a, LL b, LL &x, LL &y) {
    if(b == 0) {
        x = 1; y = 0;
        return a;
    }
    LL r = exgcd(b, a % b, x, y);
    LL t = y;
    y = x - a / b * y;
    x = t;
    return r;
}

/*能够得到x>=bound时的x和y,返回true表示有解
否则无解,我仅仅想问这个模板无脑调用有木有~
可是不同的题目特判不同,有的地方记得还是特判,比方a和b的正负和是否为0~*/
bool solve(LL a, LL b, LL c, LL bound, LL &x, LL &y) {
    LL xx, yy, d = exgcd(a, b, xx, yy);
    if(c % d) return false;

    xx = xx * c / d; yy = yy * c / d;
    LL t = (bound - xx) * d / b;

    x = xx + b / d * t;
    if(x < bound) {
        t++;
        x = xx + b / d * t;
    }
    y = yy - a / d * t;
    return true;
}

对于这道题,,我们能得出

A=n-m,B=L,C=x-y

注意A的正负性和是否为0。即可了。然后直接套模板 。以下就是个套模板的样例

#include<map>
#include<set>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>

using namespace std;
typedef long long LL;
typedef pair<int, int> PII;

const int MX = 3e4 + 5;

LL exgcd(LL a, LL b, LL &x, LL &y) {
    if(b == 0) {
        x = 1; y = 0;
        return a;
    }
    LL r = exgcd(b, a % b, x, y);
    LL t = y;
    y = x - a / b * y;
    x = t;
    return r;
}

/*能够得到x>=bound时的x和y,返回true表示有解
否则无解,我仅仅想问这个模板无脑调用有木有~
可是不同的题目特判不同,有的地方记得还是特判,比方a和b的正负和是否为0~*/
bool solve(LL a, LL b, LL c, LL bound, LL &x, LL &y) {
    LL xx, yy, d = exgcd(a, b, xx, yy);
    if(c % d) return false;

    xx = xx * c / d; yy = yy * c / d;
    LL t = (bound - xx) * d / b;

    x = xx + b / d * t;
    if(x < bound) {
        t++;
        x = xx + b / d * t;
    }
    y = yy - a / d * t;
    return true;
}

int main() {
    LL x, y, m, n, L;
    LL A, B, C, X, Y;
    while(~scanf("%I64d%I64d%I64d%I64d%I64d", &x, &y, &m, &n, &L)) {
        A = n - m; B = L; C = x - y;
        if(A == 0) { //使用solve唯一的特判放在外面
            printf("Impossible\n");
            continue;
        }
        if(A < 0) A = -A, C = -C; //保证A和B都是正数
        if(solve(A, B, C, 0, X, Y)) { //得到的x会>=1,由于不可能是0,并且也必需要非负嘛,理论上0和1都一样
            printf("%I64d\n", X); //对,,就是这样,。做完了。
        } else {
            printf("Impossible\n");
        }
    }
    return 0;
}
时间: 2024-12-29 11:31:15

扩展欧几里德 poj1061 青蛙的约会的相关文章

extended_gcd(扩展欧几里德算法) 青蛙的约会

#include <stdio.h> #include <math.h> long long gcd(long long x,long long y) { if(y==0) { return x; } return gcd(y,x%y); } void extended_gcd(long long a,long long b,long long &x,long long &y) { long long t; if(b==0) { x = 1; y = 0; retu

POJ1061——青蛙的约会(扩展欧几里德)

青蛙的约会 Description两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面.

POJ-1061 青蛙的约会-数论扩展欧几里德算法入门及推导

Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面. 我们把这

poj1061青蛙的约会(扩展欧几里得)

题目链接: 啊哈哈,点我点我 这道题是扩展欧几里得问题...哎,数学太弱了,看了半天才看懂.... 如果要相遇的话,则(n-m)*T+p*c=x-y成立,那么进行代换得到a*x+b*y=c,那么就转换成小白上面讲的了,所以用扩展欧几里得算法求得一组解,那么最后得到解的通式为x=x0+k*b/gcd(a,b),那么直接另右式子等于0及可..还有就是没有解的情况就是c%gcd(a,b)不等于0,那么就没有整数解...那么这个问题就得到了解决.... 题目: 青蛙的约会 Time Limit: 100

POJ1061青蛙的约会

Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面. 我们把这

解题报告 之 POJ1061 青蛙的约会

解题报告 之 POJ1061 青蛙的约会 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙

POJ1061 青蛙的约会 (扩展欧几里德)

本文出自:http://blog.csdn.net/svitter 题意:青蛙绕圈跳, 初始位置X,Y,速度M,N,方向相反,L为模.最后能否相遇?相遇时间是什么? 本题目为扩展欧几里德,扩展欧几里德介绍: 关于扩展欧几里德方程 ax + by = c (1) 可以用来求是否有解.即是否存在c满足这个方程. exgcd(a, b, x, y)是用来求ax + by = gcd(a, b)中x的值和y的值的.如果仅仅只是判断(1)是否有解,直接看gcd(a, b)能否整除c即可. 然后开始分析本题

POJ1061 青蛙的约会(扩展欧几里得)

题目链接:http://poj.org/problem?id=1061 青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 131879   Accepted: 29100 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的

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

青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 108911   Accepted: 21866 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总