数学:乘法逆元-拓展GCD
2024-09-03 23:02:14
乘法逆元应用在组合数学取模问题中,这里给出的实现不见得好用
给出拓展GCD算法:
扩展欧几里得算法是指对于两个数a,b
一定能找到x,y(均为整数,但不满足一定是正数)
满足x*a+y*b=gcd(a,b)
gcd(x,y)是指x 与 y的最大公约数
有啥用呢?求解形如 a*x +b*y = c 的通解
然后我们先介绍同余方程,再介绍乘法逆元
同余方程
a≡b(mod m) 等价于小学的运算式 b÷m 余数为a
也就是a mod m=b
其实介绍这个就是看怎么把≡拿掉
乘法逆元
ax ≡ (mod m)
我们称 x 是 a 关于 m 的乘法逆元
可以等价于这样的表达式: a*x + m*y =
当满足这个式子的时候:a*x + b*y = c 有解的充要条件: c % gcd(a , b) == 0
一般,我们能够找到无数组解满足条件,但是一般是让你求解出最小的那组解
我们求解出来了一个特殊的解 x0 ,我们用 x0 % m其实就得到了最小的解了
#include<cstdio>
using namespace std;
inline long long read()
{
long long x=,f=;char ch=getchar();
while(ch<''||ch>'') {if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int a,b;
void exgcd(int a,int b,int &x,int &y)
{
if(b==) {x=;y=;return;}
exgcd(b,a%b,x,y);
int t=x;x=y;y=t-a/b*y;
}
//ax ≡ 1 (mod b)
//-> a*x + b*y = 1
//->求出x和y后让x%b就是最小解了
int main()
{
a=read();b=read();
int x,y;
exgcd(a,b,x,y);
x=(x%b+b)%b;
printf("%d",x);
return ;
}
最新文章
- Spring boot 学习记录
- loadView、viewDidLoad、viewWillAppear、viewDidAppear等详解
- label与input间距的小问题
- BZOJ1443: [JSOI2009]游戏Game
- Java程序设计 实验三
- 回文串---Best Reward
- elasticsearch索引的增删改查入门
- MySQL的诡异同步问题-重复执行一条relay-log
- Hadoop Balance
- JAVA 静态代码块
- asp.net从一个页面的单击按钮事件控制另一个页面的刷新
- 一次完整的http请求所需要完成的步骤
- Android Environment 判断sd卡是否挂载 获取sd卡目录
- UVA_Cubic Eight-Puzzle UVA 1604
- Hibernate学习
- windows身份验证无法登陆,错误: 18456
- Collections.sort的两种用法
- 201521123065《Java程序设计》第1周学习总结
- hdu1754线段树的单点更新区间查询
- layui框架--关闭当前页面并刷新父页面
热门文章
- CSS3单选动画
- Fluentd插件使用方法
- linux下安装redis及主从配置
- url解析字符串
- this.getClass().getResource()示例详解
- PAT 甲级 1015 Reversible Primes
- 【SSH】——梳理三大框架
- java enum naming rules &; Pascal case, Camel case, Uppercase
- oracle补充
- 【bzoj2659】[Beijing wc2012]算不出的算式 数论