【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的最小正整数解。
var a,b,c,x,y:longint; function gcd(a,b:Longint; var x,y:Longint):longint;//扩展欧几里得定理 var t:longint; begin if b=0 then//当b=0时退出,此时a为最大公约数 begin x:=1; y:=0; exit(a); end; gcd:=gcd(b,a mod b,x,y); t:=x; x:=y; y:=t-(a div b)*y; end; begin read(a,b); c:=gcd(a,b,x,y); while (x-(b div c)>0) do x:=x-b div c; //判断x大小,如果比0大即减(b div c),此时y+(a div c)得数相等 if x<0 then while x<0 do x:=x+(b div c); //判断x小于零,同理加(b div c) writeln(x); end.