洛谷1082 同余方程
求关于 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
【解题思路】
首先ax ≡ 1 (mod b)可以化为ax+by=1,然后通过扩展欧几里得定理即可求得。
你问我什么事扩展欧几里得。。。我很难解释清楚,大概就是辗转相除的加强版,函数格式如代码所示
1 program tyfc; 2 var a,b,c,x,y:int64; 3 function gcd(a,b:int64; var x,y:int64):int64;//扩展欧几里得定理即为该函数,背过即可 4 var t:longint; 5 begin 6 if b=0 then//当b=0时退出,此时a为最大公约数 7 begin 8 x:=1; 9 y:=0; 10 exit(a); 11 end; 12 gcd:=gcd(b,a mod b,x,y); 13 t:=x; 14 x:=y; 15 y:=t-(a div b)*y; 16 end; 17 18 begin 19 read(a,b); 20 c:=gcd(a,b,x,y); 21 while (x-(b div c)>0) do//判断x大小,如果比0大即减(b div c),此时y+(a div c)得数相等 22 x:=x-b div c; 23 if x<0 then//判断x小于零,同理加(b div c) 24 while x<0 do 25 begin 26 x:=x+(b div c); 27 end; 28 writeln(x); 29 end.