码迷,mamicode.com
首页 > 其他好文 > 详细

P1082 同余方程

时间:2018-08-27 18:12:40      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:同余   sig   ios   nbsp   main   同余方程   namespace   int   ble   

题意:给定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-\lfloor\frac{a}{b}\rfloor*b$

  所以$ax+by=bx‘+(a-\lfloor\frac{a}{b}\rfloor*b)y‘$

  $a(x)+b(y)=a(y‘)+b(x‘-\lfloor\frac{a}{b}\rfloor*y‘)$

  对应相等

    $x=y‘$
    $y=x‘-\lfloor\frac{a}{b}\rfloor*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 同余方程

标签:同余   sig   ios   nbsp   main   同余方程   namespace   int   ble   

原文地址:https://www.cnblogs.com/olinr/p/9542465.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!