HDU1576(辗转相除法求逆元)

解题思路:(a/b)%m,就要求出b的逆元b1,这样就可以化为(a*b1*b/b)%m=(a*b1)%m=(a%m)*(b1%m)了。

但是求你元也是有限制的,因为逆元的推导过程是建立在ax+by=1的基础上的(详见我以前分析逆元的博客)。所以结合扩展欧几里得可知,x,y要想有整数解,gcd(a,b)必须等于1的因数,但由于1的因数只有1,所以gcd(a,b)必须为1。所以a,b互质。

所以就是求b的逆元呗!

#include
#include
#include
using namespace std;
int extgcd(int a,int b,int &x,int &y)
{
	if(b==0)
	{
		x=1;
		y=0;
		return a;
	}
	int r=extgcd(b,a%b,x,y);
	int t=x;
	x=y;
	y=t-a/b*y;
	return r;
}
int main()
{
	//freopen("t.txt","r",stdin);
	int x,y,T;
	int a,b;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&a,&b);
		extgcd(9973,b,x,y);
		y=(y+9973)%9973;
		printf("%d\n",((y%9973)*(a%9973)%9973));
	}
	return 0;
}

 

你可能感兴趣的:(#,扩展欧几里得,#,数论)