标签:
本题地址: 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