Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

hdu1576-A/B

$
0
0

http://acm.hdu.edu.cn/showproblem.php?pid=1576

1、了解扩展欧几里德算法,可以运用其解出gcd(a,b)=ax1+by1中的x1、y1的值

2、由题可得以下内容:

n=A%9973,则n=A-A/9973*9973。又A/B=x,则A=Bx。所以Bx-A/9973*9973=n。即Bx-9973y=n。

到这里我们可以发现:只要求出x的值,即可算出x%9973,也就是(A/B)%9973了。顺利解决了!

3、题目关键转到如何求出x了。题目的输入是n和B,利用扩展欧几里德算法可求出gcd(B,9973)=Bx1+9973y1=1的x1。

等式两边同乘以n,得B(nx1)-9973(-ny1)=n。可知nx1就是Bx-9973y=n的解了!!!即x=nx1。

4、对于第三部得到的x可能是负数,由题这显然是不正确的。

可以做这样的转化:(x%9973+9973)%9973


#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;

__int64 mm,nn,xx,yy,l;
__int64 c,d,x,y;

__int64 modd(__int64 a, __int64 b)
{
	 if(a>=0)
 		 return a%b;
	 else 
 		 return a%b+b; 
}

__int64 exGcd(__int64 a, __int64 b ,__int64 &x , __int64 &y )
{
 	if(b==0)
 	{
 		 x=1;
  		 y=0;
 		 return a;  
 	} 
 	__int64 r=exGcd(b, a%b , x ,y );
 	__int64 t=x;
 	x=y;
 	y=t-a/b*y;
 	return r;
}

int main()
{
	__int64 xx , yy , mm , nn , l , c , d;
 	scanf("%I64d %I64d %I64d %I64d %I64d",&xx,&yy,&mm,&nn,&l);  
 	if(mm>nn)  //·ÖÇé¿ö 
 	{
 		 d=exGcd(mm-nn,l,x,y);
  		c=yy-xx; 
	 }
 	else 
 	{
  		d=exGcd(nn-mm,l, x,y);
  		c=xx-yy; 
 	}
 	if(c%d != 0)
 	{
  		printf("Impossible\n");
  		return 0;
 	}
 	l=l/d;
	 x=modd(x*c/d,l);   ///È¡Ä£º¯ÊýҪעÒâ 
 	printf("%I64d\n",x);
 return 0;
} 


作者:liujie619406439 发表于2013-6-4 21:32:14 原文链接
阅读:32 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles