C - Line——(扩展欧几里得算法)

传送门

C. Line

time limit per test
1 second

memory limit per test
256 megabytes

input
standard input

output
standard output

A line on the plane is described by an equation Ax + By + C = 0. You are to find any point on this line,
whose coordinates are integer numbers from  - 5·1018 to 5·1018 inclusive,
or to find out that such points do not exist.

Input

The first line contains three integers AB and C ( - 2·109 ≤ A, B, C ≤ 2·109)
— corresponding coefficients of the line equation. It is guaranteed that A2 + B2 > 0.

Output

If the required point exists, output its coordinates, otherwise output -1.

Examples

input

2 5 3

output

6 -3

题目大意:

就是判断一下给定的三个数,a,b,c 是否符合 a*x + b*y + c == 0的方程,如果符合输出x 和 y的值,否者输出 -1

解题思路:

就是一个扩展欧几里得算法, 不是很难的,注意的是 将c 用 -c来代替剩下的也没啥了,扩展欧几里得是模板。。。

上代码:

<span style="font-size:18px;">#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
void exgcd(LL a, LL b, LL &x, LL &y)
{
    if(b == 0)
    {
        x = 1;
        y = 0;
        return;
    }
    LL x1, y1;
    exgcd(b, a%b, x1, y1);
    x = y1;
    y = x1 - (a/b)*y1;
}
LL gcd(LL a, LL b)
{
    if(b == 0)
        return a;
    return gcd(b, a%b);
}
int main()
{
    LL a, b, c, x, y;
    while(cin>>a>>b>>c)
    {
        c = -c;
        LL d = gcd(a, b);
        if(c % d)
            puts("-1");
        else
        {
            a /= d;
            b /= d;
            c /= d;
            exgcd(a, b, x, y);
            x *= c;
            y *= c;
            cout<<x<<" "<<y<<endl;
        }
    }
    return 0;
}
</span>
时间: 2024-10-25 14:45:52

C - Line——(扩展欧几里得算法)的相关文章

数论之 素因子分解,素数筛选法,欧拉函数和扩展欧几里得算法 (整理)

今天突然想复习一下数论,也就顺便整理了一下关于数论的基础知识, 以后用的时候直接用就行了,也不用现敲了,其实就是有点懒.... 具体解释都在代码里有解释 直接上代码了: #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <vector> #include <queue>

C语言 扩展欧几里得算法代码_C 语言

给定两个正整数m和n,我们计算它们的最大公因子d和两个整数a和b,使得a*m+b*n=d 算法流程 E1.置a'=b=1;a=b'=0;c=m,d=n; E2.计算d和r,使得c=q*d+r; E3.若r==0;则退出,当前已有a*m+b*n=d; E4;c=d;d=r;t=a';a'=a;a=t-q*a;t=b';b'=b;b=t-q*b;返回E2. 证明 对于已有的m和n,假设m>n;如果刨除变量a,b,a',b';算法与欧几里得算法完全一样,为计算最大公约数的算法. 最终要求的为a*m+b

扩展欧几里得算法求方程特解

对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整 数对 x,y ,使得 gcd(a,b)=ax+by. 代码实现如下: #include <iostream> using namespace std; typedef long long LL; void exgcd(int a,int b,int &x,int &y) { if(b==0) { x=1; y=0; return ; } exgcd(b,a%b,x,y); int tm

扩展欧几里得算法

问题:ax+by=c,已知a.b.c,求解使该等式成立的一组x,y.其中a.b.c.x.y均为整数 a,b的最大公约数为gcd(a,b).如果c不是gcd(a,b)的倍数,则该等式无解,因为等式左边除以gcd(a,b)是整数,而等式右边除以gcd(a,b)后为小数.因此,只有当c是gcd(a,b)的倍数的时候,该等式有解.这样,可以通过计算使ax1+by1=gcd(a,b)成立的x1.y1,然后有x=(c/gcd(a,b))*x1,y=(c/gcd(a,b))*y1,得到x,y. 问题就被转换为

算法 数据结构-求两个数最大公约数,欧几里得算法

问题描述 求两个数最大公约数,欧几里得算法 求两个数最大公约数,欧几里得算法,这两种方法除第一种可以避免除数为零的情况,两者有什么区别?谢谢 public static int gcd(int p, int q) { if (q == 0) return p; int r = p % q; return gcd(q, r) ; } public static int gcd(int p, int q) { int r = p % q; if (r == 0) return q; return g

【算法数据结构Java实现】欧几里得算法

1.背景            欧几里得算法是一个求最大因子的快速算法.如果m,n存在最大因子k,假设m=x*n+r,那么m和n可以整出k的话,r也肯定可以整除k            因为定理:如果M>N,则M mod N<M/2 ,说明时间复杂度是O(log(n)) 2.代码            package Algorithm_analysis; public class Euclid { public static void main(String[] args){ int m=6

菜鸟学算法----改进后的欧几里得算法

对于正整数 a和b  利用欧几里得算法可以得出 一个最大公因数 ,  改进后的算法满足  最大公因数 q=xa+yb   ; 那么我们如何求出 a和b呢 . 书上是这么写的 那么我们用代码把他实现出来, 向大家推荐一本书<The Art Of Computer.Programmer>   第一篇的数学部分   真心的枯燥 我选择的方式 是 适当的囫囵吞枣 对于这一样 ,但是对于其中讲述的算法 还是要仔细的去看滴 .   对于算法的分析  我直接上原书图 #include "stdaf

辗转相除法_欧几里得算法_java的实现(求最大公约数)

辗转相除法,又被称为欧几里德(Euclidean)算法, 是求最大公约数的算法. 当然也可以求最小公倍数. 算法描述 两个数a,b的最大公约数记为GCD(a,b).a,b的最大公约数是两个数的公共素因子的乘积.如462可以分解成2 × 3 × 7 × 11:1071可以分解成3 × 3 × 7 × 17.462和1071的最大公约数等于它们共有的素因数的乘积3 × 7 = 21.如果两数没有公共的素因数,那么它们的最大公约数是1,也即这两个数互素,即GCD(a,b)=1.另g=GCD(a,b),

SharePoint 2013自定义扩展菜单的例子

接上文:http://www.bianceng.cnhttp://www.bianceng.cn/web/sharepoint/201406/41934.htm 例七 列表设置菜单扩展(listedit.aspx) 扩展效果 XML描述 <CustomAction Id="CustomAction1" Description="博客园-霖雨" Title="博客园-霖雨" GroupId="GeneralSettings"