C. Line(扩展欧几里得求不定方程的解)

本文介绍了一个算法问题,即如何找到一条由方程 Ax + By + C = 0 定义的直线上,坐标为整数且位于特定范围内的任意一点。通过扩展欧几里得算法确定该点是否存在并计算其坐标。
部署运行你感兴趣的模型镜像
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
 
   
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

typedef long long int ll;

ll ext_gcd(ll a,ll b,ll& s,ll& t){
	
	if(b==0){
		s = 1;
		t = 0;
		return a;
	}
	ll ans = ext_gcd(b,a%b,s,t);
	ll tmp = s;
	s = t;
	t = tmp-a/b*s;
	
	return ans;
}


int main(){
	
	
	ll a,b,c;
	scanf("%I64d %I64d %I64d",&a,&b,&c);
	ll s=0,t=0;
	ll d = ext_gcd(a,b,s,t); 
	if(c%d!=0)
		printf("-1\n");
	else
		printf("%I64d %I64d\n",-1*c/d*s,-1*c/d*t);
	return 0;
}


 
   
 
   
 
   
 
   
 
   
 
  

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 使用扩展欧几里得算法求解不定方程 #### 不定方程概述 不定方程是指未知数个数多于独立方程个数的一类方程。对于形如 \( ax + by = c \) 的二元一次不定方程,其中 \( a, b, c \) 是已知常量,\( x, y \) 是待变量。 #### 扩展欧几里得算法适用条件 要使上述形式的不定方程存在整数,则必要条件是最大公约数 gcd(a, b) 能够整除 c 即满足 \( c \% \text{gcd}(a, b) == 0 \)[^4]。如果这个前提成立,那么就可以通过扩展欧几里得算法找到一组特 (x₀, y₀),进而得到通表达式。 #### 决过程详 假设给定了具体的数值参数 a=789 和 b=-234 并希望找出使得等式成立的所有可能组合(x,y): 1. 首先应用基本版欧几里德互质测试确认两者的GCD值; 2. 接着调用拓展版本获取对应系数X,Y以及d=gcd(A,B); 3. 判断C能否被D所整除;如果不可以返回无信息; 4. 如果能整除则调整比例因子k=(C/D),并将初始扩大相应倍率获得最终答案。 具体实现如下所示: ```cpp #include <iostream> using namespace std; // 定义函数用于执行扩展欧几里得算法并返回三个结果:g,x,y void ex_gcd(int a,int b,int& g,int& x,int& y){ if(b==0){ g=a; x=1; y=0; }else{ ex_gcd(b,a%b,g,x,y); // 递归调用直到余数为零为止 int temp=x-(a/b)*y; x=y; y=temp; } } int main(){ int A=789,B=-234,C,D,X,Y,GCD; cout<<"输入A B C:"<<endl; cin>>A>>B>>C; ex_gcd(abs(A),abs(B),GCD,X,Y); D=C/GCD; if(C%GCD!=0 || X*A<0 && Y*B>0){ cout << "No Solution!"<< endl; } else { cout <<"One of the solutions is :"<<endl; cout << "x="<<D*X*(A>=0?1:-1)<<", "; cout << "y="<<D*Y*(B<=0?-1:1)<<endl; } return 0; } ``` 此程序实现了读取用户输入的数据,并利用扩展欧几里得算法判断是否有及其部分特定情况下的答输出[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值