首页 > 其他 > 详细

hdu 2669 Romantic

时间:2014-10-06 13:04:30      阅读:322      评论:0      收藏:0      [点我收藏+]

使用扩展的欧几里得算法。

对于初始的两个整数$x_1,y_1$,我们一定可以计算出$ax_1+by_1 = gcd(a,b)$,递推下一步,我们可以得到公式:

\begin{equation}  ax_1+by_1 = gcd(a,b)  = gcd(b,a\%b) = bx_2 + (a\%b)y_2 \end{equation}

从而解出$x_1 = y_2$和$y_1 = x_2-(a/b)y_2$。从而我们可以使用递归实现对扩展欧几里得的计算。

需要注意的是满足条件的解不唯一,对于任意的整数$k$,我们有$x = x+kb$,$y = y - ka$同样成立,答案求的是在众多解中的最小的正整数$x$和与其配对的$y$。

代码如下:

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <iostream>
 4 #include <cstring>
 5 using namespace std;
 6 typedef long long LL;
 7 void exgcd(LL a, LL b, LL &d, LL &x, LL &y) 
 8 {
 9     if( b == 0 )
10     {
11         d = a;
12         x = 1;
13         y = 0;
14     }
15     else
16     {
17         exgcd(b, a%b, d, x, y);
18         int t = x;
19         x = y;
20         y = t - (a/b)*x;
21     }
22 }
23 int main(int argc, char *argv[])
24 {
25     LL x, y, d, a, b;
26     while(cin>>a>>b)
27     {
28         exgcd(a, b, d, x, y);
29         if( d == 1 )
30         {
31             while( x < 0 )
32             {
33                 x += b;
34                 y -= a;
35             }
36             cout<<x<<" "<<y<<endl;
37         }
38         else
39         {
40             printf ( "sorry\n" );
41         }
42     }
43 }

 

hdu 2669 Romantic

原文:http://www.cnblogs.com/jostree/p/4008072.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!