[NOIP2012]同余方程

【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.

 

转载于:https://www.cnblogs.com/yangqingli/p/4709254.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值