数论板子大总结

末鹿安然 提交于 2019-12-02 06:29:10

1.欧几里得求gcd

int gcd(int a,int b)
{
      if(b==0) return a;
      return gcd(b,a%b);
}   

2.扩展欧几里得求解线性方程

首先根据Bezout定理,对于任意的a,b:ax+by=gcd(a,b);

然后根据欧几里得求gcd的方法构成等价方程,在递归的同时求出x,y;

void exgcd(int a,int b,int &x,int &y)
{
	if(b==0){
		x=1;y=0;
                return;
	}
	gcd(b,a%b,y,x);
	y-=a/b*x;
}    

另外一种写法:(不只是long long 的事情)

void exgcd(long long a,long long b,long long& x,long long& y)
{
	if(!b){
		x=1;y=0;
		return;
	}
	exgcd(b,a%b,x,y);
	long long tmp=x; x=y; y=tmp-a/b*y;
}

  

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!