5124 Problem A 同余方程-NOIP2012TGD2T1

389 篇文章 1 订阅
144 篇文章 2 订阅

问题 A: 同余方程-NOIP2012TGD2T1
时间限制: 1 Sec 内存限制: 128 MB
献花: 20 解决: 16
[献花][花圈][TK题库]

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

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

数据规模:
对于40%的数据,2≤b≤1,000;
对于60%的数据,2≤b≤50,000,000;
对于100%的数据,2≤a, b≤2,000,000,000。

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

样例输入
3 10
样例输出
7

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <cstring>
#include <string>

using namespace std;

typedef long long LL;

/*
    对ax + by = gcd(a,b)进行求解
    a*1 + 0 * 0 = gcd(b,a%b)显然成立
    ax  +     by  = gcd(a,b)
    bx1 + (a%b)y1 = gcd(b ,a % b)   并且显然gcd(a,b) = gcd (b,a % b)

    ax + by = bx1 + (a%b)y1
    又:a%b = a - (a/b) * b         这里的a/b与计算机自动向下取整一致
    则:ax + by =  bx1 + (a - (a/b)*b)y1
    得:ax + by = ay1 + b(x1 - (a/b)y1)
    得:x = y1
        y = x1 - (a/b)y1
*/

LL exGcd(LL a, LL b, LL &x, LL &y)
{
    if (b == 0) 
    {
        x = 1;
        y = 0;
        return a;
    }
    LL gcd = exGcd(b, a%b, x, y); // x1 y1

    LL tmp = x;//x1;
    x = y;      // x = y1;
    y = tmp - (a / b) * y;//y = x1 - (a/b)y1;
    return gcd;
}


/*
    ax = 1(mod b)
    等价于求  ax + by = 1 如果方程有解则一定有gcd = 1
*/
int main()
{
#ifdef _DEBUG
    freopen("data.txt", "r+", stdin);
#endif // _DEBUG

    LL x, y;
    LL a, b;  
    while (cin >> a >> b)
    {
        LL gcd = exGcd(a, b, x, y);
        cout << (x % b / gcd + b / gcd) % (b / gcd) << endl;
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值