hdu--2669Romantic

来源:互联网 发布:linux 查看网络连接ip 编辑:程序博客网 时间:2024/05/18 03:07

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

0 0
原创粉丝点击