传送门

求ax%b = 1,即ax - by = 1;

很明显这是一个exgcd的形式。

那么要做这道题,首先需要gcd和exgcd的算法作铺垫。

gcd(辗转相膜法):

int gcd(int a,int b){
if(b == ){
return a;
}
return gcd(b,a%b);
}

exgcd就是在求出gcd的基础上,求出ax+by = gcd(a,b)的一组x,y的解:

int exgcd(int a,int &x,int b,int &y){
if(b == ){
x = ;
y = ;
return a;
}
int g = exgcd(b,x,a%b,y);
int tx = x;
x = y;
y = tx -a/b*y;
return g;
}

这个算法的原理如下:

  • 当b=0时,gcd(a,b) = a,ax+by 即 a*1 + 0*0 = gcd(a,b);(因为b = 0,y的值其实不重要,这里就写成0)
  • 因为gcd(a,b) =  ax+by,gcd(b,a%b) = ax'+ by',

   每次递归时,gcd(a,b) = gcd(b,a%b),所以ax+by = ax'+ by',

   并且已知 a%b = a-(a/b)*b,那么可以得到

    ax'+by'
= bx + (a%b)y
   = bx + (a-a/b*b)y
   = bx + ay - (a/b)*by
   = ay + b(x-(a/b)*y)
  
    x'=y; y'=(x-(a/b)*y)

有了这些铺垫,再来看这道题:

ax+by=1,即gcd(a,b) = 1,说明a,b一定是互质的,方程才能有解(虽然知道了这个也没什么用orz)。

现在已经求出了一组x,y的解,怎么保证x是最小正整数呢?

已知

   ax+by

  = ax + by + k*ab - k*ab

  = a(x+kb) + (y-ka)b

也就是说,当x改变b的整数倍时,原式的值可以保持不变;

那么最小正整数即为x%b;

但是要考虑x为负数的情况,就要先将x加上b,直到x为正数,再取模,可以得到

  x = (x%b+b)%b;

完整代码如下

#include<cstdio>
using namespace std;
int a,b,x,y;
void exgcd(int a,int &x,int b,int &y){
if(b == ){
x = ;
y = ;
return;
}
exgcd(b,x,a%b,y);
int k = x;
x = y;
y = k-a/b*y;
return;
}
int main(){
scanf("%d%d",&a,&b);
exgcd(a,x,b,y);
x = (x%b+b)%b;
printf("%d",x);
return ;
}

Luogu P1082 同余方程(exgcd模版)的更多相关文章

  1. 【luogu P1082 同余方程】 题解

    最近一直在学习数论,讲得很快,害怕落实的不好,所以做一道luogu的同余方程练练手. 关于x的同余方程 ax ≡ 1 mod m 那么x其实就是求a关于m的乘法逆元 ax + my = 1 对于这个不 ...

  2. 洛谷 P1082 同余方程 —— exgcd

    题目:https://www.luogu.org/problemnew/show/P1082 用 exgcd 即可. 代码如下: #include<iostream> #include&l ...

  3. Luogu P1082 同余方程(NOIP 2012) 题解报告

    题目传送门 [题目大意] 求关于x的同余方程 ax≡1(mod b)的最小整数解. [思路分析] 由同余方程的有关知识可得,ax≡1(mod b)可以化为ax+by=1,此方程有解当且仅当gcd(a, ...

  4. [Luogu P1082]同余方程

    题目链接 这道题求关于x的同余方程ax≡1(mod b)的最小正整数解.换而言之方程可以转换为ax+by=1,此时有y为负数.此时当且仅当gcd(a,b)|1时,方程有整数解. 于是乎这道题就变成了a ...

  5. luogu P1082 同余方程 |扩展欧几里得

    题目描述 求关于 x的同余方程 ax≡1(modb) 的最小正整数解. 输入格式 一行,包含两个正整数 a,ba,b,用一个空格隔开. 输出格式 一个正整数 x,即最小正整数解.输入数据保证一定有解. ...

  6. 洛谷——P1082 同余方程

    P1082 同余方程 题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输 ...

  7. 洛谷P1082 同余方程 [2012NOIP提高组D2T1] [2017年6月计划 数论06]

    P1082 同余方程 题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输 ...

  8. 洛谷 P1082 同余方程(同余&&exgcd)

    嗯... 题目链接:https://www.luogu.org/problem/P1082 这道题很明显涉及到了同余和exgcd的问题,下面推导一下: 首先证明有解情况: ax + by = m有解的 ...

  9. 洛谷 P1082 同余方程(exgcd)

    题目传送门 解题思路: 因为推导过程过于复杂,懒得写,所以题解传送门 AC代码: #include<iostream> #include<cstdio> using names ...

随机推荐

  1. canvas-0scale.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. ImmediateFunc.js

    (function(){ var days = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'] var today = new Date() var msg = ...

  3. linux学习笔记-安装配置使用clamav杀毒软件

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 1.安装clamav 2.更新病毒库 # freshclam 如果更新不了,或者更新特别慢,可以手动下载病毒库文件,放到/var ...

  4. Python 3.4:Chromedrive,IEDriverServer,geckoDriver

    import sys; import time; import os; #from huoche import PythonTickt; from splinter.browser import Br ...

  5. js 动态绑定事件 on click 完美解决绑定不成功

    动态绑定坑了多少人..... //绑定   $("ol").on("click","li a",function(){ ...   }) / ...

  6. √n求单值欧拉函数

    基本定理: 首先看一下核心代码: 核心代码 原理解析: 当初我看不懂这段代码,主要有这么几个问题: 1.定理里面不是一开始写了一个n*xxx么?为什么代码里没有*n? 2.ans不是*(prime[i ...

  7. 定时器setTimeout实现函数节流

    问题描述 文字输入查询的keyup或oninput事件,实现实时查询功能. 在用户输入过程中,用户可能只想需要 '小' 字的查询结果,但是以上两个事件会触发'x'.'i'.'a'.'o'.'小',一共 ...

  8. 《Inside C#》笔记(五) 方法

    方法用来体现类的行为. 一 相关概念 a) ref和out 通常一个方法只能返回一个值,但如果确实需要返回多个值时,可以使用ref或out.如果方法的参数被标注为ref或out,在调用该方法时,会传递 ...

  9. vue路由的配置

    一.准备工作 1安装vue-cli  npm install vue-cli -g 2检查是否安装成功 vue -V(大写V) 3初始化一个新的项目 vue init  webpack vue-dem ...

  10. NoHttp封装--05 文件下载

    xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:la ...