I - 扩展欧几里得! CodeForces - 7C

2024-03-12 22:58

本文主要是介绍I - 扩展欧几里得! CodeForces - 7C,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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*X+B*Y+C=0  给出A,B,C求一组合适的值是方程成立。

扩展欧几里得的推倒:

我们知道  gcd(a,b)=gcd(b,a%b);

则            a*x+b*y=gcd(a,b) 和 b*x+(a%b)*y=gcd(b,a%b) 是相等的。

然后 就有  a*x+b*y= a*x1+(a%b)*y1

设k=a/b有 a*x+b*y= b*x1+(a-k*b)*y1

                a*x+b*y=b*x1+(a-(a/b)*b)*y1;   

               a*x+b*y=b*x1+a*y1-(a/b)*b*y1;

               a*x+b*y=a*y1+b*(x1-(a/b)*y1);

所以得到 a*x=a*y1   -->   x=y1;

 b*y=b*(x1-(a/b)*y1) -->   y=x1-(a/b)*y1;

所以扩展欧几里得的算法实现是

int gcd(int a,int b,int &x,int &y )
{int temp=a;if(b==0)         //递推返回条件当b==0时;{x=1;         //最后返回的条件是x=1,y=1;y=0;}else{temp=gcd(b,a%b,y,x);  //辗转相除求最大公约数 b,a%b,就是交换a,b,的位置;y-=(a/b)*x;    //公式推导出   x=y;    y=x-(a/b)*y;// 前面的已将 x,y,交换位置所以后面的写法}return temp;
}

 

在本题中需要化成 a*x+b*y=gcd(a,b);的形式;

所以要同时除以 -C/gcd(A,B);

最后算结果时要乘上这个些才是这题的结果

完整代码如下;

#include<stdio.h>
long long int gcd(long long int a,long long int b,long long int &x,long long int &y )
{long long int temp=a;if(b==0)         //递推返回条件当b==0时;{x=1;         //最后返回的条件是x=1,y=1;y=0;}else{temp=gcd(b,a%b,y,x);  //辗转相除求最大公约数 b,a%b,就是交换a,b,的位置;y-=(a/b)*x;    //公式推导出   x=y;    y=x-(a/b)*y;// 前面的已将 x,y,交换位置所以后面的写法}return temp;
}
int main()
{long long int a,b,c;while(~scanf("%lld%lld%lld",&a,&b,&c)){long long  int x,y;      //X,Y 最后结果是x=1 ,y=0;long long int r=gcd(a,b,x,y); //x=-x*c/r;     //因为化成 ax+by=gcd(a,b);所以最后的结果要乘上 c/gcd(a,b);y=-y*c/r;if(c%r==0)    //当gcd(a,b)==1 时才会有解, 这是ax+by=c有解的充要条件,既c% gcd(a,b)==0;printf("%lld %lld\n",x,y);elseprintf("-1\n");}return 0;
}

 

这篇关于I - 扩展欧几里得! CodeForces - 7C的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/802859

相关文章

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

最大公因数:欧几里得算法

简述         求两个数字 m和n 的最大公因数,假设r是m%n的余数,只要n不等于0,就一直执行 m=n,n=r 举例 以18和12为例 m n r18 % 12 = 612 % 6 = 06 0所以最大公因数为:6 代码实现 #include<iostream>using namespace std;/

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja

PHP7扩展开发之数组处理

前言 这次,我们将演示如何在PHP扩展中如何对数组进行处理。要实现的PHP代码如下: <?phpfunction array_concat ($arr, $prefix) {foreach($arr as $key => $val) {if (isset($prefix[$key]) && is_string($val) && is_string($prefix[$key])) {$arr[