P1082 同余方程

Posted olinr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1082 同余方程相关的知识,希望对你有一定的参考价值。

题意:给定a,b,求$ax equiv 1 pmod b$的最小正整数解x,保证有解

 

exgcd:求$ax+by=gcd(a,b)$的 一组解x,y

  首先根据正常的gcd可得出   $gcd(a,b)=gcd(b,a\%b)$

  假设我们已经得到了一组解x‘ y‘

  则 $bx‘+(a\%b)y‘=gcd(b,a\%b)$

  则 $ax+by=gcd(a,b)=gcd(b,a\%b)=bx‘+(a\%b)y‘$

  而且$a\%b=a-lfloorfrac{a}{b} floor*b$

  所以$ax+by=bx‘+(a-lfloorfrac{a}{b} floor*b)y‘$

  $a(x)+b(y)=a(y‘)+b(x‘-lfloorfrac{a}{b} floor*y‘)$

  对应相等

    $x=y‘$
    $y=x‘-lfloorfrac{a}{b} floor*y‘$

  一直递归求解,若b=0

  则x=1 y=0 就行了

对于方程 $ax equiv b pmod c$有解,当且仅当gcd(a,c)|b

所以对于此题gcd(a,b)|1

貌似给你ab互质了啊

所以。。。。

直接用

ax+by=gcd(a,b)=1

求解就行了

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
#define int long long
#define olinr return
#define _ 0
#define love_nmr 0
#define DB double
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(!isdigit(ch))
    {
        if(ch==-)
            f=-f;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
inline void put(int x)
{
    if(x<0)
    {
        x=-x;
        putchar(-);
    }
    if(x>9)
        put(x/10);
    putchar(x%10+0);
}
inline void exgcd(int a,int b,int &x,int &y)
{
    if(!b)
    {
        x=1;
        y=0;
        return;
    }
    exgcd(b,a%b,x,y);
    int t=x-a/b*y;
    x=y;
    y=t;
}
signed main()
{
    int a,b,x,y;
    a=read();
    b=read();
    exgcd(a,b,x,y);
    while(x<0) x+=b;
    put(x);
    olinr ~~(0^_^0)+love_nmr;
}

 

以上是关于P1082 同余方程的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P1082 同余方程 数论

洛谷 P1082 同余方程

洛谷 P1082 同余方程

luogu P1082 同余方程题解

洛谷 P1082 同余方程 题解

洛谷P1082同余方程