Luogu P1082 同余方程(exgcd模版)
求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模版)的更多相关文章
- 【luogu P1082 同余方程】 题解
最近一直在学习数论,讲得很快,害怕落实的不好,所以做一道luogu的同余方程练练手. 关于x的同余方程 ax ≡ 1 mod m 那么x其实就是求a关于m的乘法逆元 ax + my = 1 对于这个不 ...
- 洛谷 P1082 同余方程 —— exgcd
题目:https://www.luogu.org/problemnew/show/P1082 用 exgcd 即可. 代码如下: #include<iostream> #include&l ...
- Luogu P1082 同余方程(NOIP 2012) 题解报告
题目传送门 [题目大意] 求关于x的同余方程 ax≡1(mod b)的最小整数解. [思路分析] 由同余方程的有关知识可得,ax≡1(mod b)可以化为ax+by=1,此方程有解当且仅当gcd(a, ...
- [Luogu P1082]同余方程
题目链接 这道题求关于x的同余方程ax≡1(mod b)的最小正整数解.换而言之方程可以转换为ax+by=1,此时有y为负数.此时当且仅当gcd(a,b)|1时,方程有整数解. 于是乎这道题就变成了a ...
- luogu P1082 同余方程 |扩展欧几里得
题目描述 求关于 x的同余方程 ax≡1(modb) 的最小正整数解. 输入格式 一行,包含两个正整数 a,ba,b,用一个空格隔开. 输出格式 一个正整数 x,即最小正整数解.输入数据保证一定有解. ...
- 洛谷——P1082 同余方程
P1082 同余方程 题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输 ...
- 洛谷P1082 同余方程 [2012NOIP提高组D2T1] [2017年6月计划 数论06]
P1082 同余方程 题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输 ...
- 洛谷 P1082 同余方程(同余&&exgcd)
嗯... 题目链接:https://www.luogu.org/problem/P1082 这道题很明显涉及到了同余和exgcd的问题,下面推导一下: 首先证明有解情况: ax + by = m有解的 ...
- 洛谷 P1082 同余方程(exgcd)
题目传送门 解题思路: 因为推导过程过于复杂,懒得写,所以题解传送门 AC代码: #include<iostream> #include<cstdio> using names ...
随机推荐
- 详解 ESLint 规则,规范你的代码
在很久之前就想通过工具来规范自己的代码风格,减少程序出错的概率,如果看过我的 一个前端程序猿的Sublime Text3的自我修养 ,这篇博客的朋友,肯定知道在当时我使用 SublimeLinter- ...
- userDefineFunc.js
var scareMe = function(){ console.log("cynthia") scareMe = function(){ console.log("w ...
- ajax小知识
1.ajax发送get请求时,需要注意如下情况: var uri="http://127.0.0.1:8071/springmvcdemo/bigdataapi/publishdata&qu ...
- 【转】解决CentOS 64位系统vsftpd 530 login incorrect的问题
转自:http://www.centos.bz/2011/12/centos-64-install-vsftpd-530-login-incorredct/ 今天在centos 6 64位测试安装vs ...
- JMeter 逻辑控制之While循环控制器(While Controller)
逻辑控制之While循环控制器(While Controller) by:授客 QQ:1033553122 测试环境 apache-jmeter-2.13 1. 添加While Control ...
- Jenkins 解决Jenkins下java无法运行slave-agent jnlp程序连接Windows Slave主机
解决Jenkins下java无法运行slave-agent jnlp程序连接Windows Slave主机 by:授客 QQ:1033553122 测试环境 java下载地址:http://www ...
- (网页)the server responded with a status of 403 (Forbidden)
403跨域问题.看一下要访问的url.
- Spark Word2Vec算法代码实现
1 import com.hankcs.hanlp.tokenizer.NLPTokenizer import org.apache.hadoop.io.{LongWritable, Text} im ...
- 【第八篇】SAP ABAP7.5x新语法之F4增强【续】
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:SAP ABAP7.5x系列之F4增强[续] ...
- Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)【转】
Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息.它定义在include/linux/sched.h文件中. 谈到task_str ...