HDU 1576-A/B(扩展欧几里得算法)

A/B

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6144    Accepted Submission(s): 4835


Problem Description
要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。
 

Input
数据的第一行是一个T,表示有T组数据。
每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。
 

Output
对应每组数据输出(A/B)%9973。

 

Sample Input
  
  
2 1000 53 87 123456789
 

Sample Output
  
  
7922 6060
//扩展欧几里得算法,用逆元求除法取模
//对于求除法取模,(a/b)%c = (a*ni)%c,其中ni是b与c的逆元
//逆元的求法是扩展欧几里得算法,exged(b,c,x,y),最终的x便是b与c的逆元
#include <stdio.h>
int exgcd(int a, int b, int &x, int &y)
{
	if(b==0)
	{
		x = 1;
		y = 0;
		return a;
	}
	int r = exgcd(b, a%b, x, y);
	int t = x;
	x = y;
	y = t-a/b*y;
	return r;
}

int main()
{
	int T;
	scanf("%d", &T);
	while(T--)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		int x, y;
		exgcd(b, 9973, x, y);
		int ans = (a*x)%9973;
		if(ans>=0)
            printf("%d\n", ans);
        else
            printf("%d\n", ans+9973);
	}
	return 0;
}



最后,总结一下扩展欧几里得能干什么

扩展欧几里德算法的应用主要有以下三方面:

(1)求解不定方程;

(2)求解模线性方程(线性同余方程);

(3)求解模的逆元;


(1)使用扩展欧几里德算法解决不定方程的办法:

  对于不定整数方程pa+qb=c,若 c mod Gcd(p, q)=0,则该方程存在整数解,否则不存在整数解。

 至于pa+qb=c的整数解,只需将p * a+q * b = Gcd(p, q)的每个解乘上 c/Gcd(p, q) 即可。

用扩展欧几里得算法解不定方程ax+by=c;
代码如下:
bool linear_equation(int a,int b,int c,int &x,int &y)
{
    int d=exgcd(a,b,x,y);
    if(c%d)
        return false;
    int k=c/d;
    x*=k; y*=k;    //求得的只是其中一组解
    return true;
}

(2)用扩展欧几里德算法求解模线性方程的方法:(我还不是很懂)

    同余方程 ax≡b (mod n)对于未知数 x 有解,当且仅当 gcd(a,n) | b。且方程有解时,方程有 gcd(a,n) 个解。

    求解方程 ax≡b (mod n) 相当于求解方程 ax+ ny= b, (x, y为整数)

可以学习一下:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html


(3)用欧几里德算法求模的逆元:(可以用来求除法取模,即(a/b)%c==a*ni(b,c)%c)

       同余方程ax≡b (mod n),如果 gcd(a,n)== 1,则方程只有唯一解。

      在这种情况下,如果 b== 1,同余方程就是 ax=1 (mod n ),gcd(a,n)= 1。

      这时称求出的 x 为 a 的对模 n 乘法的逆元。

      对于同余方程 ax= 1(mod n ), gcd(a,n)= 1 的求解就是求解方程

      ax+ ny= 1,x, y 为整数。这个可用扩展欧几里德算法求出,原同余方程的唯一解就是用扩展欧几里德算法得出的 x 。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值