7C-扩展欧几里德解线性方程

Ax+By+C=0,给你A,B,C求x,y

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long INF = 5 * 1e18;

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 -= x * (a / b);
    }
}

int main(int argc, char *argv[])
{
    long long a, b, c, d, x, y;
    cin >> a >> b >> c;
    gcd(a, b, d, x, y);
    if(c % d != 0)
        puts("-1");
    else
        cout << -x * (c / d) << " " << -y * (c / d) << endl;
    return 0;
}
时间: 2024-10-21 00:07:39

7C-扩展欧几里德解线性方程的相关文章

扩展欧几里德--解的个数

解的个数 已知整数x,y满足如下面的条件: ax+by+c = 0 p<=x<=q r<=y<=s 求满足这些条件的x,y的个数. 输入描述 Input Description 第一行有一个整数n(n<=10),表示有n个任务.n<=10 以下有n行,每行有7个整数,分别为:a,b,c,p,q,r,s.均不超过108. 输出描述 共n行,第i行是第i个任务的解的个数. 样例输入 2 2 3 -7 0 10 0 10 1 1 1 -10 10 -9 9 样例输出 1 19

扩展欧几里德解的数量(51nod 1352)

题意:给出N,A,B:求A*x+ B*y = N+1   的大于0 的解的数量: 思路:先用exgcd求出大于0的初始解x,rest = N - x*A; sum = rest/LCM(A, B); #include <iostream> #include <algorithm> #include <stdlib.h> #include <time.h> #include <cmath> #include <cstdio> #incl

Codeforces7C-扩展欧几里德解线性方程(Ax+By+C=0)

#include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #include <string.h> #include <iostream> #include <vector> #include <list> #include <stack> #include <queue> #include <

URAL 1204. Idempotents 扩展欧几里德

题目来源:URAL 1204. Idempotents 题意:输入n(n = p*q p,q是质数) 并且x*x=x(mod n) 求x 思路: x*x=x(mod n)  -> x*x+k*n=x -> x*(x-1)/n = k 所以 0 和 1 是一组解 因为n = p*q 且x*(x-1)%(p*q)== 0 x < n 因为x*x%n == x 模n之后才是x 1.x有p因子x-1有q因子 x%p == 0且(x-1)%q == 0 a*p == x且b*q == x-1 得到

欧几里德和扩展欧几里德详解 以及例题CodeForces 7C

欧几里德定理: 对于整数a,b来说,gcd(a, b)==gcd(b, a%b)==d(a与b的最大公约数),又称为辗转相除法 证明: 因为a是d的倍数,b是d的倍数:所以a%d==0:b%d==0: 设k=a/b:r=a%b:则 a=k*b+r: 由上得出:r=a-k*b: 因为a和b都是d的倍数,所以(a-k*b)也是d的倍数,所以r也是d的倍数: 所以gcd(a, b)==gcd(b, a%b)==d 而为什么要证明gcd(a, b)==gcd(b, a%b)==d这个式子成立呢? 其实证

扩展欧几里德算法详解

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

欧几里德及扩展欧几里德——详解

欧几里德定理: 对于整数a, b来说有,gcd (a, b) == gcd (b, a%b) == d,又称为辗转相除法. 欧几里德证明: 先进行设定:x, y, t, k 为整数,并且有d*x == a, d*y == b. t = a - b. k = a / b. 那么t = d*x - d*k*y; t = d * (x - k * y); 故 t % d == 0; 所以gcd (b, t) == d == gcd (b, a%b) == gcd (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

欧几理德,扩展欧几里德和模线性方程组。

欧几里德算法: 即求两个整数的最大公约数的一种快捷算法.也就是通常所说的“辗转相除法”.给定两个整数 a, b.欧几里德最坏可以在log(max(|a|, |b|))的复杂度内求出a, b的最大公约数.时间复杂度的计算方法也很有意思, 详见<算法导论>. 证明欧几里德算法的正确性: a可以表示成a = kb + r,且 r = a mod b 我们要证明欧几里德算法的正确性 也即是证明 gcd(a, b) = gcd(b, a%b=r) 假设d是a,b的一个公约数,则有 d|a, d|b,而r