题目

这里给出非递归的 exgcd 做法


【基础】

( 只需要非递归的同学麻烦跳过 )

由于欧几里德算法 ( 又名辗转相除法 ) 可以帮助我们求出最大公约数,并且提出对于

\(\forall a,b\in Z_+,gcd(a,b)|c\) 则 $ ax+by=c $ 一定有整数解

因此,在 \(gcd\) 的基础上,我们提出可以求解 \(x,y\) 的算法:拓展欧几里德算法(exgcd)

如果我们要求解 \(ax+by=gcd(a,b)\)

我们可以知道 \(gcd(a,b)=gcd(b,a\%b)\)

而还有 \(gcd(b,a\%b)=bx'+(a\%b)y'\)

所以,很快可以得到:\(ax+by=bx'+(a\%b)y'\)

\(\because\) 很显然 \(a\%b=a-\lfloor{a\over b}\rfloor\times b\)

\(\therefore\) 我们把上式打开可得到:

\(\qquad ax+by=bx'+ay'-\lfloor{a\over b}\rfloor\times by'\)

\(\qquad ax+by=ay'+b(x'-\lfloor{a\over b}\rfloor y')\)

因此,我们要求得 \(x,y\) 就要先求出 \(x',y'\)

而对于 \(ax+0y=gcd(a,0)=a\) ,显然有解为 \(x=1,y=0\)

这就是递归边界

因此,我们可以写出求 \(x,y\) 的程序:

void exgcd(int a,int b,int &x,int &y){
if(!b) { x=1; y=0; return ; }
exgcd(b,a%b,x,y);
x-=a/b*y;
swap(x,y);
}

那这根这一题有什么关系呢?

你想想,我们要求 \(ax\equiv1(\mod b)\)

是不是相当于求 \(ax=1+by\)

即 \(ax+b(-y)=1\) ?

看到了吗,exgcd 出现了!

所以就是再加一句

inline int ny(int a,int b){
int x,y;
exgcd(a,b,x,y);
x=(x%b+b)%b;
return x;
}

【分析】

这边讲一下如何非递归的实现 exgcd :

有一部分原理麻烦看一下 这篇文章

已知我们只是需要每次出现的 \(a/b\) 这个值,而且要后面出现的先算,所以我们就把它们压到一个栈里面

算的时候再弹出来就可以了:

int a=read(),b=read(),m=b,tmp[10000]={0},cur=1,x=1,y=0;
tmp[0]=a/b;
while(b^=a^=b^=a%=b) tmp[cur++]=a/b;
while(cur--) y^=x^=y^=x-=tmp[cur]*y;
x=(x%m+m)%m;

【代码】

核心代码我已经放在上面了,现在放出来的是本蒟蒻 码风极丑的 代码:

#include<cstdio>
using namespace std;
inline int read(){
register int ans=0;register char c=getchar(); while(c<48||c>57) c=getchar();
while(c>=48&&c<=57) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
int main(){
register int a=read(),b=read(),m=b,tmp[10000]={0},cur=1,x=1,y=0; tmp[0]=a/b;
while(b^=a^=b^=a%=b) tmp[cur++]=a/b;
while(cur--) y^=x^=y^=x-=tmp[cur]*y; x%=m;
printf("%d",(x<0)?(x+m):x);
return 0;
}

最后安利一下 本蒟蒻的博客

题解 P1082 【同余方程】的更多相关文章

  1. 洛谷——P1082 同余方程

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

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

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

  3. 洛谷P1082 同余方程 题解

    题目链接:https://www.luogu.com.cn/problem/P1082 题目大意: 求关于 \(x\) 的同余方程 ax≡1(mod b) 的最小正整数解. 告诉你 \(a,b\) 求 ...

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

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

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

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

  6. 洛谷 P1082 同余方程 题解

    每日一题 day31 打卡 Analysis 题目问的是满足 ax mod b = 1 的最小正整数 x.(a,b是正整数) 但是不能暴力枚举 x,会超时. 把问题转化一下.观察 ax mod b = ...

  7. [NOIP2012] 提高组 洛谷P1082 同余方程

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

  8. 洛谷P1082 同余方程

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

  9. [Luogu P1082]同余方程

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

随机推荐

  1. junit小试log4j及xml配置文件说明

        上篇文章介绍了java日志框架使用情况,以及xml配置文件的简单说明.但主要还是根据别人的博客整理一下知识结构,只能是纸上谈兵,本文通过junit测试框架来玩玩log4j. 1.junit+l ...

  2. DevOps - 与传统方式区别

    章节 DevOps – 为什么 DevOps – 与传统方式区别 DevOps – 优势 DevOps – 不适用 DevOps – 生命周期 DevOps – 与敏捷方法区别 DevOps – 实施 ...

  3. dedecms 标签使用 runphp=php 获取文章静态地址

    [field:id runphp='yes'] $url=GetOneArchive(@me); @me=$url['arcurl']; [/field:id]

  4. 【剑指Offer】面试题28. 对称的二叉树

    题目 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的.     1    / \   2   2 ...

  5. HihoCoder第六周:01背包问题

    01背包问题大二的时候就接触过了,几行关键代码自己也都看过很多遍了,但是很多代码一直都没能理解.所以今天拿表来好好地画一画,弄懂其中的动态规划究竟什么含义. 1038 : 01背包 时间限制:2000 ...

  6. vue + canvas 图片加水印

    思路:将两张图片绘制为一张 目标:输入的文字,绘制到图片上,简单实现图片水印 效果:输入的文字1: ‘你猜猜’ + 图片2 = 图片3(不要看清除水印的按钮,本人垃圾 没实现) 选择图片 html & ...

  7. phpStudy配置站点解决各种不能访问问题(本地可www.xx.com访问)

    1.配置站点:打开phpStudy->其他选项菜单->站点域名管理 2.配置站点:打开phpStudy->其他选项菜单->打开hosts(www访问重点) 3.在apache的 ...

  8. Linux运维命令笔记一

     1.Centos 无netstat 命令 yum -y install net-toolnetstat -tunp  2.Centos防火墙 systemctl stop firewalld.ser ...

  9. 字符串匹配之BF算法

    1)算法原理 BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符:若不相等 ...

  10. 留学Essay写作做到精准表达很关键

    很多留学生在essay写作中可以迅速想到合理的中文论点.可是,写出来的英文论点却漏洞百出,不忍直视.在essay写作中我们要如何精准地用英文写出自己内心的独白呢?除了咨询老师,靠自己一样能做到! 1引 ...