最近想学数论

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

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

然后水掉了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. LOCK TABLES 和 UNLOCK TABLES

    MySQLdump的时LOCK TABLES 和 UNLOCK TABLES 在mysqldump后的数据中会发现有 LOCK TABLES tables_name WRITE;和结尾处有 UNLOC ...

  2. C#动态系统托盘图标

    C#动态系统托盘图标 利用timer组件定时执行变化. using System; using System.Windows.Forms; namespace DynamicStockIcon { p ...

  3. 【C++ Primer 第13章】1. 拷贝控制、赋值和销毁

    拷贝控制.赋值和销毁 如果一个构造函数的第一个参数是自身类的引用,且额外的参数都有默认值,则此构造函数是拷贝控制函数(拷贝构造函数不应该是explicit的). 如果我们没有为一个类定义拷贝构造函数, ...

  4. python---使用二叉堆实现的优先队列(列表)

    哟,有实用价值 可以看到,加入是随机的,而吐出是顺序的. # coding = utf-8 # 使用二叉堆实现的优先队列(列表) class BinaryHeap: def __init__(self ...

  5. 使用SecureCRT脚本备份网络设备配置的一点感悟

    https://blog.csdn.net/qq_25294171/article/details/85158458

  6. Centos7编译安装GCC7.2

    通常编译的时候可能需要新版本的gcc,本文就说明下基于低版本的gcc升级为gcc7.2 wget 'http://mirrors-usa.go-parts.com/gcc/releases/gcc-7 ...

  7. postgresql 查询某一个表中的所有字段

    select * from information_schema.columns where table_schema='public' and table_name='表名称 ';

  8. Python自用笔记

    函数:raw_input()和input() 注意:在python3.x中,已经删除raw_input(),取而代之的是input(),当然这仅仅是重命名,用法还是一样.因此在这里介绍的是python ...

  9. Python 2.7 cython cythonize py 编译成 pyd 谈谈那些坑

    Python 2.7 cython cythonize py 编译成 pyd 谈谈那些坑 前言 基于 python27 的 pyc 很容易被反编译,于是想到了pyd,加速运行,安全保护 必要准备 安装 ...

  10. mysql group by组内排序

    mysql group by组内排序:     首先是组外排序:     SELECT z.create_time,z.invoice_id from qf_invoice_log z where z ...