同余方程

来源:互联网 发布:cacti添加windows主机 编辑:程序博客网 时间:2024/04/29 20:21

本题地址: 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的最小正整数解。

【代码】

<span style="font-size:18px;">var a,b,c,x,y:int64;function gcd(a,b:int64; var x,y:int64):int64;//扩展欧几里得定理var t:int64;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.</span>


0 0