最近想学数论

刚好今天(初赛上午)智推了一个数论题

我屁颠屁颠地去学了乘法逆元

然后水掉了P3811P2613

(zcy吊打集训队!)(逃

然后才开始做这题。

乘法逆元

乘法逆元的思路大致就是a*x恒等于1(mod b)满足a,b互质,则x为a的逆元

这里给一个P2613的函数

void exgcd(int a, int b, int &d, int &x,int &y)
{
if (b == ) {
d = a;
x = ;
y = ;
return;
}
exgcd(b, a%b, d, x, y);
int t = y;
y = x - (a / b)*y;
x = t;
}

还有一个线性算法,就是适合P3811的

a[i] = (p-p/i)*a[p%i]%p;//zcyddjxd

大致就是这两种了

本蒟蒻在数学一本通上看的线性貌似是a[i] = -(p/i)*a[p%i]%p; 看起来用在这里不行

思路

上面介绍了一下乘法逆元的算法,其中第一种就是扩展欧几里得的出来的

我这里引用@huangdu233 大佬的题解的分析(我自己推导不来,只会插模板)

求解不定方程a*x+b*y==gcd(a,b);
先给个解法推导吧:
∵a=[a/b]*b+a%b;
又∵欧几里得知:gcd(a,b)==gcd(b,a%b);
∴([a/b]*b+a%b)*x+b*y=gcd(a,b);
∴[a/b]*b*x+(a%b)*x+b*y=gcd(a,b);
∴b*([a/b]*x+y)+(a%b)*x=gcd(b,a%b);
看到这里,我们不难发现:
令:a'=b,x'=[a/b]*x+y,b'=a%b,y'=x;
整理后原式又变成了:a'*x'+b'*y'==gcd(a',b');
当当当当!!!!!可以递归了

废话了那么多,我就直接给代码吧

#include<bits/stdc++.h>
#define ll long long
#define mod 19260817
#define MAXN 10010
using namespace std;
ll a,b,x,y;
void exgcd(ll a, ll b, ll &x, ll &y)
{
if (b == ) {
x = ;
y = ;
return;
}
exgcd(b, a%b, y, x);
y -= (a / b)*x;
}
int main()
{
cin >> a >> b;
exgcd(a, b, x, y);
cout << (x + b) % b;
}

(刚用上VisualStudio 感觉还行)

注意

刚发现hl大佬写了这题的题解!

https://www.luogu.org/blog/hl666/solution-p1082

Orz 太强了

[P1082][NOIP2012] 同余方程 (扩展欧几里得/乘法逆元)的更多相关文章

  1. luogu1082 [NOIp2012]同余方程 (扩展欧几里得)

    由于保证有解,所以1%gcd(x,y)=0,所以gcd(x,y)=1,直接做就行了 #include<bits/stdc++.h> #define pa pair<int,int&g ...

  2. hdu_1576A/B(扩展欧几里得求逆元)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 A/B Time Limit: 1000/1000 MS (Java/Others)    Me ...

  3. 扩展欧几里得模板&逆元求法

    拓展欧几里得: 当 gcd ( a , b )= d 时,求绝对值和最小的 x , y 使得 x * a + y * b = d : d = gcd ( a , b ) = gcd ( b , a m ...

  4. luogu P1082 同余方程 |扩展欧几里得

    题目描述 求关于 x的同余方程 ax≡1(modb) 的最小正整数解. 输入格式 一行,包含两个正整数 a,ba,b,用一个空格隔开. 输出格式 一个正整数 x,即最小正整数解.输入数据保证一定有解. ...

  5. NOIP2012 同余方程-拓展欧几里得

    题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正 ...

  6. 洛谷——P2054 [AHOI2005]洗牌(扩展欧几里得,逆元)

    P2054 [AHOI2005]洗牌 扩展欧拉定理求逆元 $1 2 3 4 5 6$$4 1 5 2 6 3$$2 4 6 1 3 5$$1 2 3 4 5 6$ 手推一下样例,你就会发现是有规律的: ...

  7. hdu 1576 A/B 【扩展欧几里得】【逆元】

    <题目链接> <转载于 >>> > A/B Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)( ...

  8. 【数学】【NOIp2012】同余方程 题解 以及 关于扩展欧几里得与同余方程

    什么是GCD? GCD是最大公约数的简称(当然理解为我们伟大的党也未尝不可).在开头,我们先下几个定义: ①a|b表示a能整除b(a是b的约数) ②a mod b表示a-[a/b]b([a/b]在Pa ...

  9. 【扩展欧几里得】NOIP2012同余方程

    题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正 ...

随机推荐

  1. Sublime Text 3 快捷键总结(拿走)

    以下是个人总结不完全的快捷键总汇,祝愿各位顺利解放自己的鼠标. 选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本. Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同 ...

  2. python列表1

    List (列表)List(列表) 是 Python 中使用最 频繁的数据类 型.列表 可以 完成大 多数集 合类 的数据 结构 实现. 列表中 元素 的类型 可以 不相同 ,它支 持数 字,字 符串 ...

  3. linux 搭建testlink的问题总结

    testlink问题总结 1.要求环境centos7,安装php版本5.5以上(7.1.5),mysql5.6 ,5.7测试还不行(改变挺大的5.7表结构,字段啥的待研究),apache任意版本即可 ...

  4. 我的第一个Java程序和Java简介

    public calss HelloWorld{ public static void main(String[] args){ System.out.println("Hello Worl ...

  5. .NET成年了,然后呢?

    作者|Lex Li 编辑|郭蕾 这可能是唯一一篇系统回顾 .NET 发展的文章..NET 的成年礼到了,你会送它什么? 2014 年 11 月 12 日,美国纽约曼哈顿,多云,气温适宜.微软公司执行副 ...

  6. (1).NET CORE微服务 Micro-Service ---- 什么是微服务架构,.netCore微服务选型

    开发工具:VS2017 .Net Core 2.1 什么是微服务?单体结构: 缺点:1)只能采用同一种技术,很难用不同的语言或者语言不同版本开发不同模块:2)系统耦合性强,一旦其中一个模块有问题,整个 ...

  7. Java基础知识➣多线程编程(五)

    概述 Java 给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径.使用多线程也是为了充分的利用服务器资源, ...

  8. stl测试

    以下测试都在学校电脑进行 我觉得应该比考试机器慢一点.. 1.map map的速度测出来和放入数值大小有很大关系 比如 #include <bits/stdc++.h> using nam ...

  9. Codeforces 356D Bacterial Melee dp

    Bacterial Melee 我们发现所有合法串都是原序列的某个子序列(这个子序列相邻元素相等) 的扩展, 比如子序列为abc, 那么aabbbc, abbbcc 等都是合法串. 所以我们只需要dp ...

  10. 伪分布式hbase从0.94.11版本升级stable的1.4.9版本

    Hbase从0.94.11升级到stable的1.4.9版本: 升级思路: hadoop1.1.2    hbase 0.94.11                             ↓ had ...