洛谷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.  

 

posted @ 2015-08-21 06:47  Alisahhh  阅读(242)  评论(0编辑  收藏  举报