【OI】同余方程
一.同余方程的判定
我们知道同余方程是形如
ax ≡ b (mod n) 的东西,用文字表达就是:
ax和b除以n的余数相同
那么,经过如下推理:(用=代替恒等于)
ax=b (mod n)
ax=b+n*x2 (转化为b加上n乘上某个数等于ax)
ax-n*x2=b(移项得)
a x1 + n x2 = b(转换)
ax + ny = b
但是为了看起来更顺眼,我们将除x,y的元素改变名称,得到:
ax + by = c
那么,判断是否有解:
举几个例子,不难得到:
c|gcd(a,b)时,ax + by = c有解。
然后可以举几个例子:
①2x + 3y = 1
这是一种特殊情况,解得其中一个解为 x0 = -1, y0 = 1
②4x + 6y = 2
化简为 2x + 3y = 1,解同上
③2x + 3y = 5
解得其中一个解为 x0 = -5, y0 = 5
发现与①的规律,也就是x0 * 5,y0 * 5
那么就可以将ax + by = c 简化为ax + by = 1 ,
换种形式表达就是:ax ≡ 1 (mod n)
二.同余方程的解法
这时,我们需要引入exgcd。
exgcd可以用来求
ax + by = gcd (a,b)
那么,如何证明呢?
先给出结果:
{
要解 ax + by = 1
先解 bx + (a%b)y = 1
}
如何得到它?
在 bx + (a%b)y = 1 中展开a,得到
a = b·floor(a/b) + a%b
代入原方程,得
b·floor(a/b) + a%b)x + by = 1
与ax + by = 1等量代换,得
(a%b)*x + b(floor(a/b)·x+y) = 1
得到其中解:y0 = x,x0 = floor(a/b)·x+y
又由gcd(a,b) = gcd(b,a%b) 得到
exgcd(a,b,x,y) = exgcd(b,a%b,y,x), y -= (a/b) * x
代码:
#include <cstdio>
void exgcd(int a, int b, int &x, int &y)
{
if (b == ) x = , y = ;
else exgcd(b, a % b, y, x), y -= (a / b) * x;
}
int main()
{
int a = , b = , x, y;
exgcd(a, b, x, y);
printf("%d %d\n", x, y);
return ;
}
【OI】同余方程的更多相关文章
- 收集一些关于OI/ACM的奇怪的东西……
一.代码: 1.求逆元(原理貌似就是拓展欧几里得,要求MOD是素数): int inv(int a) { if(a == 1) return 1; return ((MOD - MOD / a) * ...
- OI总结(垃圾排版就忽略了吧)
学OI一年了,到现在联赛所需要的知识已经基本学完了.现在,有必要回过头来,总结总结自己一年来学到的知识以及得到的经验教训. 基础 语言基础 C++的语言基础啥的就略了吧. 算法复杂度分析 O:复杂度的 ...
- OI知识点|NOIP考点|省选考点|教程与学习笔记合集
点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...
- OI中组合数的若干求法与CRT
OI中组合数的若干求法与CRT 只是下决心整理一下子呢~ 说明:本篇文章采用\(\binom{a}{b}\)而不是\(C_{a}^b\),以\(p\)指代模数,\(fac_i\)指代\(i!\),\( ...
- OI数学汇总
最前面:\(\LaTeX\)可能需要加载一会,请耐心等待o~ 前言 数学在\(\text{OI}\)中十分重要.其中大多都是数论. 什么是数论? \[ 研究整数的理论 --zzq \] 本文包含所有侧 ...
- ACM&OI 基础数论算法专题
ACM&OI 基础数学算法专题 一.数论基础 质数及其判法 (已完结) 质数的两种筛法 (已完结) 算数基本定理与质因数分解 (已完结) 约数与整除 (已完结) 整除分块 (已完结) 最大公约 ...
- 啥也不是 -「OI 易犯错误整理」
原帖出自 Nefelibata,不过他不想维护,所以就交给 STrAduts 了 awa.因为一些不可抗力,帖主转移至 XSC062.申请置顶! 前言 Nefelibata:因为笔者弱到无法形容,因此 ...
- 再见,OI
你好,NOIP 2015年9月1日 正式成为了福建省莆田一中的一名高一成员 后来学校搞了选修 大家都很激动 因为自己的兴趣和特长能够得到发挥了(或者说能逃课或者看好多电影) 发现选修提供的选项中有好几 ...
- NOIP2012同余方程[exgcd]
题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开 输出格式: 输出只有一行,包含一个正整 ...
随机推荐
- arx代码片段
ObjectARX代码片段二 转载自网络 一 在ARX中禁用AutoCAD的某个命令 以LINE命令为例,在程序中加入下面的一句即可禁用LINE命令: acedCommand(RTSTR, &q ...
- 05JavaScript中的事件处理
JavaScript中的事件处理 在JavaScript中,事件的发生主要是由窗口中内容变化.键盘和鼠标引起的.JavaScript在某些事件发生的时候,可以通过一些相应的事件处理器来捕获这些事件,并 ...
- Oracle XE WM_CONCAT undifine
用docker 跑了个oracle XE 报错 没有WM_CONCAT 下载三个sql文件然后按顺序执行后可以正常使用 一:下载三个文件 解压到 oracle 目录下面 (要能找到,注意权限要o ...
- 新一代 Linux 文件系统 btrfs 简介
https://www.ibm.com/developerworks/cn/linux/l-cn-btrfs/ Btrfs 简介 文件系统似乎是内核中比较稳定的部分,多年来,人们一直使用 ext2/3 ...
- 「 COGS 2240 」 X 「 Luogu P2885 」 架设电话线
解题思路 首先很容易就想到了一个二维的朴素的 $dp$. 设 $dp[i][j]$ 表示第 $i$ 个位置的电话线杆的高度为 $j$ 时的最小花费,就需要枚举第 $i$ 个电话线杆.第 $i$ 个电话 ...
- oracle的分号、斜杠和commit
;分号表示一个语句的结束 //表示执行前面的一个代码块,例如begin/end,代码块后面必须跟/才能执行. commitcommit表示提交一个事务,例如insert,delete,update等, ...
- MySQL4
MySQL数据库4 1 管理索引 创建索引帮助 help CREATE INDEX 创建索引 指令 CREATE INDEX 语法格式 CREATE INDEX index_name ON tbl_n ...
- LINUX应用开发工程师职位(含答案)
就业模拟测试题-LINUX应用开发工程师职位 本试卷从考试酷examcoo网站导出,文件格式为mht,请用WORD/WPS打开,并另存为doc/docx格式后再使用 试卷编号:143989试卷录入者: ...
- docker CE 的安装
一.Docker CE的安装1.先决条件运行环境:Ubuntu 64位或者其他支持Docker的64位系统运行配置,linux内核版本必须大于 3.10,否则会因为缺少容器运行所需的功能而出错. 2. ...
- mybatis源码阅读-执行一个sql的流程(九)
图解 图片来源:https://my.oschina.net/zudajun/blog/670373 Mapper接口调用原理 我们整合成Spring 直接使用Mapper就能执行对应的sql 表现 ...