hdu--2669Romantic

对于欧几里得算法,仔细研究几天,反复看了几次百度百科和别人的博客详解,总算是明白了不少,始终相信,坚持就一定会有收获,有关于欧几里得算法的题目,推导出不定方程很重要,一旦要求的不定方程推导出来,对硬搬扩展欧几里得算法模板应该也能解决问题,关于深刻理解扩展gcd算法,由于之前写了青蛙的约会的经典扩展Gcd的题目,收藏下下面这个博客链接以后回头再理解理解:点击打开链接每一步都很详细

接下来就是关于这道牵手虐单身狗的2669,题目意思是:给a,b两个整数,求使得x*a+b*y=1;的x,和y,并要求x要是正数,自然一步了然是扩展gcd,所以死套模板,然而在杭电上交代码用long long int过不了,只好用--I64d,,这里不得不吐槽下杭电oj的一些bug,做KMP算法的时候,next数组用next不行,非要改成其他名称才能过,坑的一批

用完gcd算法,x和y值就会有了,然而这时候的x并不一定是正数,于是根据通解公式x=c*x+b*t;y=c*y-a*t;这里t是任意正数,题目中c又是1,所以只要x<0,就可以用循环x+b使其大于0,自然同时要y-a;这样求得的就是正确答案啦!

题目链接:点击打开链接


代码如下:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
//typedef long long __int64;
__int64 kgcd(__int64 a,__int64 b,__int64 &x,__int64 &y){
	if(!b){
		x=1;
		y=0;
		return a;
	}
	__int64 ans=kgcd(b,a%b,y,x);
	y-=a/b*x;
	return ans;
}
int main(){
	__int64 a,b;
	while(cin>>a>>b){
		__int64 x,y;
		__int64 ans=kgcd(a,b,x,y);
		if(1%ans!=0){
			cout<<"sorry"<<endl;
			//printf("sorry\n");
			continue;
		}
		while(x<=0){
			x+=b;
			y-=a;
		}
		cout<<x<<" "<<y<<endl;
		//printf("%I64d %I64d\n",k1,k2);
	}
	return 0;
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值