码迷,mamicode.com
首页 > 其他好文 > 详细

同余方程

时间:2015-08-06 22:11:35      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:

本题地址: http://www.luogu.org/problem/show?pid=1082

【NOIP 2012 提高组 第二天 第一题】

【题目描述】

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

【输入输出格式】

输入格式:

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

输出格式:

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

【输入输出样例】

输入样例#1:

3 10

输出样例#1:

7

【说明】

对于 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

运用扩展欧几里得算法,求出一组解。根据所有解的规律:

x加上b/gcd(a,b),同时y减去a/gcd(a,b)后,仍满足ax+by=c。

求出x的最小正整数解。

 1 var a,b,c,x,y:int64;  
 2 
 3   
 4 
 5 function gcd(a,b:int64; var x,y:int64):int64;//扩展欧几里得定理  
 6 
 7 var t:int64;  
 8 
 9 begin  
10 
11     if b=0 then//当b=0时退出,此时a为最大公约数  
12 
13     begin  
14 
15         x:=1;  
16 
17         y:=0;  
18 
19         exit(a);  
20 
21     end;  
22 
23     gcd:=gcd(b,a mod b,x,y);  
24 
25     t:=x;  
26 
27     x:=y;  
28 
29     y:=t-(a div b)*y;  
30 
31 end;  
32 
33   
34 
35 begin  
36 
37     read(a,b);  
38 
39     c:=gcd(a,b,x,y);  
40 
41     while (x-(b div c)>0) do x:=x-b div c;  
42 
43     //判断x大小,如果比0大即减(b div c),此时y+(a div c)得数相等  
44 
45     if x<0 then while x<0 do x:=x+(b div c);  
46 
47     //判断x小于零,同理加(b div c)  
48 
49     writeln(x);  
50 
51 end.  

 

同余方程

标签:

原文地址:http://www.cnblogs.com/yangqingli/p/4709254.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!