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;
        return;
    }
    extended_gcd(b,a%b,x,y);
    t=x;
    x = y;
    y = t- a/b*y;
    return;
}

int main( )
{
    long long x, y, m, n, l;
    long long a,b,c,d,p,q;
    long long t;
    while(scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l)!= EOF )
    {
        a= n-m;
        b=l;
        c= x-y;
        d= gcd(a,b);
        if(c%d!=0)
        {
            puts( "Impossible" );
            continue;
        }
        a/= d,b/= d,c/= d;
        extended_gcd(a,b,p,q);
        p*= c;
        t= p%b;
        while(t<0)
        {
            t+= b;
        }
        printf("%lld\n",t);
    }
    return 0;
}

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

时间: 2024-10-29 04:12:11

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

扩展欧几里德 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>

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

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

扩展欧几里德算法详解

扩展欧几里德算法 谁是欧几里德?自己百度去 先介绍什么叫做欧几里德算法 有两个数 a b,现在,我们要求 a b 的最大公约数,怎么求?枚举他们的因子?不现实,当 a b 很大的时候,枚举显得那么的na?ve ,那怎么做? 欧几里德有个十分又用的定理: gcd(a, b) = gcd(b , a%b) ,这样,我们就可以在几乎是 log 的时间复杂度里求解出来 a 和 b 的最大公约数了,这就是欧几里德算法,用 C++ 语言描述如下: 由于是用递归写的,所以看起来很简洁,也很好记忆.那么什么是扩

【zz】欧几里德与扩展欧几里德算法相关

关于欧几里德与扩展欧几里德算法在此附上我自学的时用的网站:感谢:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 这里我会结合该大牛的成果以及自己的收获总结一下: 欧几里德算法: 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 证明: a可以表示成a = kb +

扩展欧几里德算法—求解不定方程,线性同余方程

#include<stdio.h> int extended_gcd(int a,int b,int &x,int &y) { int r,t; if(!b) { x = 1; y = 0; return a; } r = extended_gcd(b,a%b,x,y); t = x; x = y; y = t-a/b*y; return r; } int main() { int a,b,x,y,z; scanf("%d%d",&a,&b)

poj2115-C Looooops(扩展欧几里德算法)

本题和poj1061青蛙问题同属一类,都运用到扩展欧几里德算法,可以参考poj1061,解题思路步骤基本都一样.一,题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循环几次才会结束. 比如:当k=4时,存储的数 i 在0-15之间循环.(本题默认为无符号) 若在有限次内结束,则输出循环次数. 否则输出死循环.二,思路: 本题利用扩展欧几里德算法求线性同余方程,设循环次数为 x ,则解方程 (A + C*x) % 2^k = B ;求出最小正整数 x. 1,化简方

扩展欧几里德算法

文章来源:http://blog.csdn.net/zhjchengfeng5/article/details/7786595 谁是欧几里德?自己百度去 先介绍什么叫做欧几里德算法 有两个数 a b,现在,我们要求 a b 的最大公约数,怎么求?枚举他们的因子?不现实,当 a b 很大的时候,枚举显得那么的na?ve ,那怎么做? 欧几里德有个十分又用的定理: gcd(a, b) = gcd(b , a%b) ,这样,我们就可以在几乎是 log 的时间复杂度里求解出来 a 和 b 的最大公约数了

欧几里德与扩展欧几里德算法(转)

欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 第一种证明: a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a

HDU 1098 Ignatius&#39;s puzzle 费马小定理+扩展欧几里德算法

题目大意: 给定k,找到一个满足的a使任意的x都满足 f(x)=5*x^13+13*x^5+k*a*x 被65整除 推证: f(x) = (5*x^12 + 13 * x^4 + ak) * x 因为x可以任意取 那么不能总是满足 65|x 那么必须是 65 | (5*x^12 + 13 * x^4 + ak) 那么就是说 x^12 / 13 + x^4 / 5 + ak / 65 正好是一个整数 假设能找到满足的a , 那么将 ak / 65 分进x^12 / 13 + x^4 / 5中得到