zoukankan      html  css  js  c++  java
  • 同余方程 (codevs1200)

    题目描述×××

    求关于 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。

    NOIP 2012 提高组 第二天 第一题

    思路:

    这个题与扩展欧几里得求逆元有密切的联系

    巧了,题目中的式子正是我们喜闻乐见的求逆元的形式a*x1(mod  m

    x称为a关于模m的乘法逆元

    我们可以将上面那个逆元的式子转化成这个样子

    a*x+m*y=1


    如果在x与m互质的情况下,这不就是一个扩展欧几里得的基本式子吗(gcd(a,m)=1),所以说,这又在gcd(a,m)=1的时候逆元才有整数解,直接套入扩展欧几里得,会得到一组 x, y,然后

    x=x % m
    y=y % m

    就能得到最小解了,因为这个式子:

    x=x0+m*t
    y=y0+m*t
     
    于是对于这个题,我们只需把这对特殊解x0求出来,然后向它加m直到x0>0
    #include<iostream>
    #include<cstdio>
    using namespace std;
    void gcd(int a,int b,int &x,int &y)
    {
        if(b==0)
        {
            x=1;y=0;
            return;
        }
        gcd(b,a%b,x,y);
        int temp=x;
        x=y;
        y=temp-(a/b)*y;
        return;
    }
    int main()
    {
        int a,b,x,y;
        scanf("%d%d",&a,&b);
        gcd(a,b,x,y);
        while(x<=0)x+=b;
        cout<<x;
        return 0;
    }

     

  • 相关阅读:
    02.两数相加
    1480. 一维数组的动态和
    01. 两数之和
    67.二进制求和
    文献阅读(QoS-Aware Web Service Recommendation by Collaborative Filtering)
    服务计算---课程总结报告
    125. 验证回文串
    Docker 常用命令
    Docker 安装
    RESTful
  • 原文地址:https://www.cnblogs.com/thmyl/p/6055461.html
Copyright © 2011-2022 走看看