2
9
2015
0

NOIP提高组2012同余方程

这是一道水题:使用扩展欧几里得算法即可。

关于扩展欧几里得算法:

众所周知,欧几里得算法有这样的性质:gcd(a,b)  = gcd(b,a mod b);

而扩展欧几里得算法是用于解形如:ax+by = gcd(a,b) = k 的不定方程通解;

那么这样的通解存在且b∈N*时有:bx'+(a mod b) y' =gcd(a,b)同样有解;

由于 a mod b = a - [a/b]b,则原方程可化为:y'a+(x'-[a/b]y')b = gcd(a,b);递归求解即可,复杂度O(log n)。

 

那么原题中方程ax≡1(mod b)由同余定义可以化为ax=1+by,即ax-by = 1,于是就成为了扩展欧几里得算法模板题= =

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
void extgcd(LL a,LL b,int &x,int &y){
	if(!b){x = 1;y = 0;return;}
	extgcd(b,a%b,x,y);
	int tmp = x;x = y;y = tmp-(a/b)*y;
}

int main()
{
	LL a,b;
	int x,y;
	scanf("%lld%lld",&a,&b);
	extgcd(a,b,x,y);
	x = (x % b + b) % b;
	printf("%d\n",x);
	return 0;
}

 

 

 

Category: 数学相关 | Tags: | Read Count: 681

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com