欧几里得.p1061青蛙

一系列等式变换后,at+bp=gcd(a,b),要求最小的t,求最小的t之前先求出一组t,p,怎么求呢

对于不完全为0的非负整数a, b.  gcd(a, b)表示a, b 的最大公约数。那么存在整数x y使得 gcd(a, b) = a * x + b * y;  

所以,求出x,y来,就是一组t,p,求这个用改装过的gcd             

求出来后,又变化一下,恩,出结果了,并且因为都是整数,c%d要为0

求出一组t,p后找到最小的t的方法是欧几里得

欧几里得是什么,我会好好学的,现在先记录一下



#include <iostream>

#include<stdio.h>

using namespace std;

void gcd(long long a,long long b,long long &d,long long &x,long long &y)

{

    if(!b)

    {

        d=a;

        x=1;

        y=0;

    }

    else

    {

        gcd(b,a%b,d,y,x);

        y=y-x*(a/b);

    }

}

int main()

{

    long long x,y,m,n,l,a,c,b,d=0;

    while(~(scanf("%lld %lld %lld %lld %lld",&x,&y,&n,&m,&l)))

    {

        a=m-n;

        c=x-y;

        b=l;

        gcd(a,b,d,x,y);

        if(c%d)

            cout << "Impossible" << endl;

        else

        {

            x=(x*c/d)%(b/d);

            if(x<0)

                x=x+b/d;

            cout<<x<<endl;

        }

        

    }

    

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值