4.28 每日一题题解

同余方程

涉及知识点:

  • exgcd

solution:

  • \(这是一道数论裸题,可以直接当板子用\)
  • \(≡是一个同余符号,即 a*x\)%\(b = 1\)%\(b\)
  • \(上式可以化简成 ax+by = 1,y是任意正整数\)
  • \(接下来引入今天的知识点:扩展欧几里得算法,下面给出定义:\)
  • \(若 a,b 是整数,且 gcd(a,b)=d,那么对于任意的整数x,y\)
  • \(ax+by 都一定是 d 的倍数,特别地,一定存在整数 x,y,使 ax+by=d 成立\)
  • 扩展欧几里得证明
  • \(这一题由于是要找到最小正整数解,如果求出的x是负数,需要再加上一个b\)
  • \(比如5x + 6y = 1,x最小的整数解是-1,如果不限制最小整数解,还可以是5,11....\)
  • \(如果你还是啥都没听懂,就把这个当作一个模板记住\)
  • \(适用于:给出a,b,d,已知ax+by = d,求最小的x\)

std:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll exgcd(ll a,ll b,ll &x,ll &y)
{
    if(!b){
        x=1,y=0;
        return a;
    }
    ll r=exgcd(b,a%b,x,y);
    ll t=y;
    y=x-(a/b)*y;
    x=t;
    return r;
}
int main()
{
    ll a,b,x,y;
    scanf("%lld%lld",&a,&b);
    ll e = exgcd(a,b,x,y);
    x = (x+b)%(b);//如果没有要求是最小的正整数x,就把这一行去掉
    printf("%lld\n",x);
    return 0;
}

posted @ 2020-04-28 09:15  QFNU-ACM  阅读(91)  评论(0编辑  收藏  举报