数论扩展欧几里德基础习题(4.15)

来源:互联网 发布:淘宝我回答的怎么删除 编辑:程序博客网 时间:2024/05/29 17:06

https://www.luogu.org/problem/lists?name=%E5%90%8C%E4%BD%99%E6%96%B9%E7%A8%8B&orderitem=pid&tag=

题目:

题目描述

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

输入

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

输出

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

样例输入

3 10

样例输出

7

思路:对题目中的式子进行变形可以得到ax - by = 1.可用扩展欧几里德算出一组x,y

由于保证数据肯定有解,可知gcd(a,b) = 1

由书中可知 x` = x + kb`,y` = y + k a`.其中(a` = a/gcd(a,b),b` = b / gcd(a,b) )

long long temp = b / d;/*注:因为要求最小,依旧要满足方程,那么要保证当x改变,依旧是成立的。而b / d 作为x改变值,是能使得方程成立的最小值(如果肯能是负数要换成整数)*/
    x = (x % temp + temp) % temp;的方法确保是最小的整数解

get

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <sstream>#include <string>#include <algorithm>#include <list>#include <map>#include <vector>#include <queue>#include <stack>#include <cmath>#include <cstdlib>using namespace std;void gcd(long long a,long long b,long long &d,long long &x,long long &y){    if(!b)    {        d = a,x = 1,y = 0;    }    else {        gcd(b,a%b,d,y,x);        y -= x *(a/b);    }}int main(){   // freopen("in.txt","r",stdin);    long long a,b;    scanf("%lld%lld",&a,&b);    long long d,x,y;    gcd(a,b,d,x,y);    long long temp = b / d;    x = (x % temp + temp) % temp;    printf("%lld\n",x);    return 0;}


0 0
原创粉丝点击