对于欧几里得算法,仔细研究几天,反复看了几次百度百科和别人的博客详解,总算是明白了不少,始终相信,坚持就一定会有收获,有关于欧几里得算法的题目,推导出不定方程很重要,一旦要求的不定方程推导出来,对硬搬扩展欧几里得算法模板应该也能解决问题,关于深刻理解扩展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;
}