题解 P1082 【同余方程】
这里给出非递归的 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 【同余方程】的更多相关文章
- 洛谷——P1082 同余方程
P1082 同余方程 题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输 ...
- 洛谷P1082 同余方程 [2012NOIP提高组D2T1] [2017年6月计划 数论06]
P1082 同余方程 题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输 ...
- 洛谷P1082 同余方程 题解
题目链接:https://www.luogu.com.cn/problem/P1082 题目大意: 求关于 \(x\) 的同余方程 ax≡1(mod b) 的最小正整数解. 告诉你 \(a,b\) 求 ...
- Luogu P1082 同余方程(NOIP 2012) 题解报告
题目传送门 [题目大意] 求关于x的同余方程 ax≡1(mod b)的最小整数解. [思路分析] 由同余方程的有关知识可得,ax≡1(mod b)可以化为ax+by=1,此方程有解当且仅当gcd(a, ...
- 【luogu P1082 同余方程】 题解
最近一直在学习数论,讲得很快,害怕落实的不好,所以做一道luogu的同余方程练练手. 关于x的同余方程 ax ≡ 1 mod m 那么x其实就是求a关于m的乘法逆元 ax + my = 1 对于这个不 ...
- 洛谷 P1082 同余方程 题解
每日一题 day31 打卡 Analysis 题目问的是满足 ax mod b = 1 的最小正整数 x.(a,b是正整数) 但是不能暴力枚举 x,会超时. 把问题转化一下.观察 ax mod b = ...
- [NOIP2012] 提高组 洛谷P1082 同余方程
题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正 ...
- 洛谷P1082 同余方程
题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正 ...
- [Luogu P1082]同余方程
题目链接 这道题求关于x的同余方程ax≡1(mod b)的最小正整数解.换而言之方程可以转换为ax+by=1,此时有y为负数.此时当且仅当gcd(a,b)|1时,方程有整数解. 于是乎这道题就变成了a ...
随机推荐
- 021、Java中汉子与数字的相互转换,利用字符变量保存中文
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- eshop1-大型电商架构演进
1. 项目初期 2. 服务器分离 以上的服务分离架构,即使文件服务crash 了,但是application server 和 Database Server 继续可以访问运行 3. 基于并发访问越来 ...
- python django Form表单
Django 拥有自己独立的表单功能块,可以完成: 1.表单的定义 2.表单的校验 3.表单的前端样式 等功能,方便我们开发,那么接下来,我们看一下表单的定义 首先我们确定我们要编写的功能,一个提供给 ...
- Window Server 2019 配置篇(3)- 建立hyper-v集群并在其上运行win10 pro虚拟机
上次讲到我们的域里有了网关跟DHCP,这次我们要在域中建立hyper-v集群并在其上运行win10 pro虚拟机 那么什么是hyper-v集群呢? 就是两个及两个以上的运行hyper-v服务的服务器建 ...
- UVA - 712 S-Trees(S树)
题意:0往左走,1往右走,已知所有叶子的值,每个查询都是根结点到叶子结点的路径,路径的每一个点分别对应着x1,x2,x3……但是实际上的S树的路径可能并非是x1,x2,x3…… 分析:先存路径变量的顺 ...
- HihoCoder第六周:01背包问题
01背包问题大二的时候就接触过了,几行关键代码自己也都看过很多遍了,但是很多代码一直都没能理解.所以今天拿表来好好地画一画,弄懂其中的动态规划究竟什么含义. 1038 : 01背包 时间限制:2000 ...
- CSS - input 只显示下边框
CSS 样式 : border:none; border-bottom: 1px solid #000
- 【java】【反射】反射实现判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更
java的反射实现: 判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更 今日份代码: package com.sxd.streamTest; imp ...
- 071-PHP数组合并
<?php $arr1=array('a','b','c'); //定义一个数组 echo '数组$arr1的信息:<br />'; print_r($arr1); //输出数组信息 ...
- 了解C#
了解C C#能编写那些程序 Windows桌面应用程序 桌面应用有自己独立的进程与操作系统进行消息通讯,操作系统对事件进行检测,传递给桌面应用进程,桌面应用进程对这些消息进行解释,处理后,把处理结果u ...