当前位置:网站首页>求解同余方程 数论 扩展欧几里得
求解同余方程 数论 扩展欧几里得
2022-08-03 23:58:00 【Rachel caramel】
题面:
思路:
a ⋅ x = b ⋅ y + 1 a ⋅ x − b ⋅ y = 1 因为y的取值是任意的,因此可以将这个式子看成: a ⋅ x + b ⋅ y = 1 因为题目保证有解,所以a和b是互质的,即 gcd ( a , b ) = 1 而扩展欧几里得就是用来求形如: a ⋅ x + b ⋅ = c 的不定方程的整数解的 这里需要再补充一个裴蜀定理: 若 a , b 为整数,那么一定存在 a ⋅ x + b ⋅ y = gcd ( a , b ) 即 a ⋅ x + b ⋅ y 的值一定是 gcd ( a , b ) 的倍数 先考虑边界情况 a ⋅ 1 + b ⋅ 0 = gcd ( a , b ) , 此时, x = 1 , y = 0 然后考虑一般情况,假设某一次得到的解是 x 0 、 y 0 b ⋅ x 0 + ( a m o d b ) ⋅ y 0 = gcd ( a , b ) b ⋅ x 0 + ( a − ⌊ a b ⌋ ⋅ b ) ⋅ y 0 = gcd ( a , b ) a ⋅ y 0 + b ⋅ ( x 0 − ⌊ a b ⌋ ⋅ y 0 ) = gcd ( a , b ) 由此可得: x = y 0 , y = x 0 − ⌊ a b ⌋ ⋅ y 0 已知任意一组解 x 0 , y 0 通解为: x = x 0 + b gcd ( a , b ) ⋅ n x = x 0 + b gcd ( a , b ) ⋅ n a\cdot x=b\cdot y +1\\ a\cdot x-b\cdot y =1\\ \text{因为y的取值是任意的,因此可以将这个式子看成:}\\ a\cdot x+b\cdot y =1\\ \text{因为题目保证有解,所以a和b是互质的,即}\gcd(a,b)=1\\ \text{而扩展欧几里得就是用来求形如:} a\cdot x+b\cdot=c\text {的不定方程的整数解的}\\ \text{这里需要再补充一个裴蜀定理:}\\ \text{若}a,b\text{为整数,那么一定存在}a\cdot x+b\cdot y=\gcd(a,b)\\ \text{即}a\cdot x+b\cdot y \text{的值一定是}\gcd(a,b)\text{的倍数}\\ \text{先考虑边界情况}a\cdot 1+b\cdot 0=\gcd(a,b),\text{此时,}x=1,y=0\\ \text{然后考虑一般情况,假设某一次得到的解是}x_0、y_0\\ b\cdot x_0+(a\bmod b)\cdot y_0=\gcd(a,b)\\ b\cdot x_0+(a-\lfloor \frac a b \rfloor\cdot b)\cdot y_0=\gcd(a,b)\\ a\cdot y_0+b\cdot (x_0-\lfloor \frac a b \rfloor\cdot y_0)=\gcd(a,b)\\ \text{由此可得:} x=y_0 ,y=x_0-\lfloor \frac a b \rfloor\cdot y_0\\ \text{已知任意一组解}x_0,y_0\text{通解为:} \\ x=x0+ \frac{b} {\gcd (a,b)}\cdot n\\ x=x0+ \frac{b} {\gcd (a,b)}\cdot n\\ a⋅x=b⋅y+1a⋅x−b⋅y=1因为y的取值是任意的,因此可以将这个式子看成:a⋅x+b⋅y=1因为题目保证有解,所以a和b是互质的,即gcd(a,b)=1而扩展欧几里得就是用来求形如:a⋅x+b⋅=c的不定方程的整数解的这里需要再补充一个裴蜀定理:若a,b为整数,那么一定存在a⋅x+b⋅y=gcd(a,b)即a⋅x+b⋅y的值一定是gcd(a,b)的倍数先考虑边界情况a⋅1+b⋅0=gcd(a,b),此时,x=1,y=0然后考虑一般情况,假设某一次得到的解是x0、y0b⋅x0+(amodb)⋅y0=gcd(a,b)b⋅x0+(a−⌊ba⌋⋅b)⋅y0=gcd(a,b)a⋅y0+b⋅(x0−⌊ba⌋⋅y0)=gcd(a,b)由此可得:x=y0,y=x0−⌊ba⌋⋅y0已知任意一组解x0,y0通解为:x=x0+gcd(a,b)b⋅nx=x0+gcd(a,b)b⋅n
代码:
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
const int maxn=111111;
int a,b,x,y;
void exgcd(int a,int b,int *x,int *y)//扩展欧几里得算法
{
//cout<<"a="<<a<<" "<<"b="<<b<<" "<<"x="<<*x<<" "<<"y="<<*y<<endl;
if(b==0)
{
*x=1,*y=0;
return;
}
exgcd(b,a%b,x,y); //r=GCD(a,b)=GCD(b, a%b)
//cout<<"!!!a="<<a<<" "<<"b="<<b<<" "<<"x="<<*x<<" "<<"y="<<*y<<endl;
int t=*x;
*x=*y;
*y=t-a/b*(*y) ;
}
int main()
{
cin>>a>>b;
exgcd(a,b,&x,&y);
//cout<<"x="<<x<<" "<<"b="<<b<<endl;
while(x<0) x+=b;
cout<<x<<endl;
return 0;
}
边栏推荐
- 简单了解下 TCP,学习握手和挥手以及各种状态到底是怎么样的
- Unity2021 releases WebGL fog effect disappearing problem
- 电子邮件安全或面临新威胁!
- Jar a key generation document database
- 【MySQL —— 索引】
- A simple understanding of TCP, learn how to shake hands, wave hands and various states
- 使用unbound在RHEL7上搭建DNS服务
- 用队列模拟实现栈
- 搭建好pytorch环境后,pip和conda指令不能用
- View the version number of CUDA, pytorch, etc.
猜你喜欢
The "interaction design" battle of the smart cockpit
The Chinese Valentine's Day event is romantically launched, don't let the Internet slow down and miss the dark time
RSS feeds WeChat public - feed43 asain
单例模式使用饿汉式和懒汉式创建一定安全?很多人不知
浅谈我国产业园区未来的发展方向
OpenCV 图像拼接
Talking about the future development direction of my country's industrial parks
A simple understanding of TCP, learn how to shake hands, wave hands and various states
全球首款量产,获定点最多!这家AVP Tier1如何实现领跑?
用两个栈模拟队列
随机推荐
FPGA按键消抖+蜂鸣器
Pytest学习-skip/skipif
2022-08-03: What does the following go code output?A: 2; B: 3; C: 1; D: 0.package main import "fmt" func main() { slice := []i
ts用法大全
【并发编程】ReentrantLock的lockInterruptibly()方法源码分析
北京电竞元宇宙论坛活动顺利召开
Justin Sun: Web3.0 and the Metaverse will assist mankind to enter the online world more comprehensively
OpenCV 图像拼接
七夕活动浪漫上线,别让网络拖慢和小姐姐的开黑时间
"Miscellaneous" barcode by Excel as a string
MCS-51单片机,定时1分钟,汇编程序
小身材有大作用——光模块基础知识(一)
RSS feeds WeChat public - feed43 asain
Go编译原理系列7(Go源码调试)
易动纷享--测试实习生视频面试
七夕活动浪漫上线,别让网络拖慢和小姐姐的开黑时间
代码重构:面向单元测试
Three.js入门详解
Node.js的基本使用(三)数据库与身份认证
小身材有大作用——光模块寿命分析(二)