Wikioi 1200同余方程(拓展欧几里得算法)

2019-04-14 09:07发布

所谓的同余,顾名思义,就是许多的数被一个数d去除,有相同的余数。d数学上的称谓为模。如a=6,b=1,d=5,则我们说a和b是模d同余的。因为他们都有相同的余数1。
数学上的记法为:
a≡ b(mod d)
可以看出当n小于d的时候,所有的n都对d同商,比如时钟上的小时数,都小于12,所以小时数都是模12的同商.
对于同余有三种说法都是等价的,分别为:
(1) a和b是模d同余的.
(2) 存在某个整数n,使得a=b+nd .
(3) d整除a-b. 定律
1)a≡a(mod d)
2)a≡b(mod d)→b≡a(mod d)
3)(a≡b(mod d),b≡c(mod d))→a≡c(mod d) 1200 同余方程 2012年NOIP全国联赛提高组 时间限制: 1 s
空间限制: 128000 KB
题目等级 : 钻石 Diamond
题解
题目描述 Description
求关于 x 同余方程 ax ≡ 1 (mod b)的最小正整数解。 输入描述 Input Description
输入只有一行,包含两个正整数 a, b,用 一个 空格隔开。 输出描述 Output Description
输出只有一行包含一个正整数x0,即最小正整数解,输入数据保证一定有解。 样例输入 Sample Input
3 10 样例输出 Sample Output
7 数据范围及提示 Data Size & Hint
【数据范围】
对于 40% 的数据, 2 ≤b≤ 1,000 ;
对于 60% 的数据, 2 ≤b≤ 50,000,000
对于 100% 的数据, 2 ≤a, b≤ 2,000,000,000 program df;
var a,b,x,y,t:longint;
procedure gcd(a,b:longint);
var t:longint;
begin
if b=0 then
begin
x:=1; y:=0;
end
else
begin
gcd(b,a mod b);
t:=x;
x:=y;
y:=t-(a div b)*y;
end;
end; begin
readln(a,b);
gcd(a,b);
while x>b do dec(x,b);
while x<0 do inc(x,b);
writeln(x);
end.