【noip2012】同余方程

【noip2012】同余方程

描述

求关于 x的同余方程  ax ≡ 1(mod b) 的最小正整数解。

输入格式

输入文件 mod.in
输入只有一行,包含两个正整数a,b,用一个空格隔开。

输出格式

输出文件 为 modmod .out 。
输出只有一行,包含一个正整数,包含一个正整数 ,包含一个正整数 x0,即最小正整数解。 输入据保证一定有解。

测试样例1

输入

3 10

输出

7

备注

对于 40% 的数据    2 ≤b≤1,000
对于 60% 的数据    2 ≤b≤50,000,000
对于 100%的数据    2 ≤a, b≤2,000,000,000NOIP2012-TG
 由ax ≡ 1(mod b) 可以推出(ax-1)%b=0

那么ax%b=1,ax-kb=1

题目又说保证一定有解

那么就一定存在整数x,k,使ax-kb=1

由裴蜀定理可知,ax-kb=1与gcd(a,b)=1是充要条件

所以ax-kb=gcd(a,b),这就变成了扩展欧几里德的基本形式

那么我们就可以求出一组解x,y

根据

x加上b/gcd(a,b),同时y减去a/gcd(a,b)后,仍满足ax+by=c
我们可以求出最小的整数解
【代码】
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a,b,x,y,ans;
int ExGcd(int a,int b){
	if (b==0){
		x=1; y=0; return a;
	}
	ans=ExGcd(b,a%b);
	int tmp=y;
	y=x-(a/b)*y;
	x=tmp;
	return ans;
}
int main(){
	scanf("%d%d",&a,&b);
	int gcdx=ExGcd(a,b);
	x=(x%b+b)%b;
	printf("%d",x);
} 


你可能感兴趣的:(数论)