数论之旅(一): 逆元逆元!
来源:互联网 发布:怎样在淘宝查注册时间 编辑:程序博客网 时间:2024/06/03 19:34
1.基本概念:逆元可以理解为乘法中的倒数!
2.基础知识准备: 求余数。
前提条件: a,p互质。
在这里我们需要了解 (a / b) % p = (a%p / b%p) %p 这样是错的。
举个简单的反例 (10 / 4)% 3 = 2, (10 % 3 / 4 % 3) % 3 = 0. 很明显不一样。
而对于加法,减法,乘法而言都是正确的。
所以,我们需要引入 逆元 的概念,来帮助我们解决问题—>对于一些题目,我们必须在中间过程中进行求余,否则数字太大,会爆范围。 我们假设逆元为 inv(b)。
(a / b) % p = (a * inv(b) ) % p = (a % p * inv(b) % p) % p。
实现 除法—->乘法的转变。
接下来我们来探究如何求解逆元。
方法一:扩展欧几里德算法
欧几里德有个十分有用的定理: gcd(a, b) = gcd(b , a%b) 。
所以我们可以在log的时间里求出 a,b的gcd。
ll gcd(ll a,ll b){ return b == 0 ? a : gcd(b, a%b); }
#include<cstdio>typedef long long LL;void ex_gcd(LL a, LL b, LL &x, LL &y, LL &d){ if (!b) {d = a, x = 1, y = 0;} else{ ex_gcd(b, a % b, y, x, d); y -= x * (a / b); }}LL inv(LL t, LL p){//如果不存在,返回-1 LL d, x, y; ex_gcd(t, p, x, y, d); return d == 1 ? (x % p + p) % p : -1;}int main(){ LL a, p; while(~scanf("%lld%lld", &a, &p)){ printf("%lld\n", inv(a, p)); }}
未续待完。。
阅读全文
0 0
- 数论之旅(一): 逆元逆元!
- 数论学习之起步篇(一)
- NOIP2014复习之数论(一)
- 数论之欧几里德算法(一)
- 一名提高选手的数论之路(一)
- 数论初步(一)
- HHU2017(一)数论
- 一名提高选手的数论之路(二)
- bzoj 2219: 数论之神 (BSGS+GCD+数论)
- 取石子(一)-博弈数论
- ACM 数论 兔子的烦恼(一)
- 浅谈简单数论及应用(一)
- ACM数论之旅6---数论倒数,又称逆元(我整个人都倒了( ̄﹏ ̄))
- ACM数论之旅6---数论倒数,又称逆元(我整个人都倒了( ̄﹏ ̄))
- hdu 1576(数论之扩展欧几里得)
- 数论学习之起步篇(二)
- 数论学习之起步篇(三)
- 数论学习之起步篇(二)
- 配置防火墙端口访问
- cpp:变量的定义与Java中的不同
- 常见的五类排序算法图解和实现(交换类:冒泡排序,递归的快速排序)
- Android 性能优化系列
- mysql中union,左连接,右连接,与内连接
- 数论之旅(一): 逆元逆元!
- vue前端开发项目框架搭建(node+webpack+vue)
- HOJ 3200 No Game School(多个完全背包)
- 习题7.1
- 牛客网网络程序赛低年级组之求最大值
- notepad的wp
- 文件路径
- 运算符,常量和变量,强制类型转换
- LeetCode小白菜笔记[4]:Roman to Integer