【luogu P1082 同余方程】题解

最近一直在学习数论,讲得很快,害怕落实的不好,所以做一道luogu的同余方程练练手。

关于x的同余方程

ax ≡ 1 mod m

那么x其实就是求a关于m的乘法逆元

ax + my = 1

对于这个不定方程的全部解是

{ x = x0 + m/gcd(a,m)

{ y = y0 - a/gcd(a,m)

我们可以用exgcd来求出其中的一组特解x0

那么什么是exgcd?

先不考虑exgcd,假设当前我们要处理的是求出 a 和 b的最大公约数,并求出 x 和 y 使得 a*x + b*y= gcd ,而我们已经求出了下一个状态:b 和 a%b 的最大公约数,并且求出了一组x1 和y1 使

得: b*x1 + (a%b)*y1 = gcd

那么我们看 a%b = (a-(a/b)*b)

所以
gcd = b*x1 + (a%b)*y1
= b*x1 + (a-(a/b)*b)*y1
= b*x1 + a*y1 – (a/b)*b*y1
= a*y1 + b*(x1 – a/b*y1)

那么我们对比前面一组 a*x + b*y = gcd

在这里 x = y1

y = x1 - a/b*y1

所以我们就可以递归来求exgcd了。

在gcd当中,gcd(a,b) = gcd(b,a%b)

那么exgcd的代码其实也多不了多少

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <iostream>
 4 #define ll long long
 5 using namespace std;
 6 ll a, b, x, y, k, ans;
 7 int exgcd(ll a, ll b)
 8 {
 9     if(b == 0)
10     {
11         x = 1; y = 0;
12         return a;
13     }
14     exgcd(b,a%b);
15     k = x;
16     x = y;
17     y = k - a/b * y;
18     return x;
19 }
20 int main()
21 {
22     cin>>a>>b;
23     ans = exgcd(a,b);
24     cout<<(ans+b)%b;
25     return 0;
26 }

其实你看gcd的代码这么短,肯定是背过的吧(#滑稽),exgcd也长不了多少,不行就背过吧(逃

原文地址:https://www.cnblogs.com/MisakaAzusa/p/8474717.html

时间: 2024-10-19 18:16:52

【luogu P1082 同余方程】题解的相关文章

洛谷 P1082 同余方程 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1082 题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正整数 x0,即最小正整数解.输入数据保证一定有解. 输入输出样例 输入样例#1: 3 10 输出样例#1: 7 说明 [数据范围]

洛谷P1082 同余方程 数论

洛谷P1082 同余方程 数论 要求 ax === 1 (mod b) 相当于求 ax + by == 1 的解并要求 x 为最小的正整数 这样我们只要 扩展欧几里德来一发,然后最小正整数 取 mod 就行了 但是一般题目里会让你求一个最小的x,当你用拓欧求出一个解时,一般会让你去找一个最小解,我们只需要对这个数取模b就行了(如果求正数,你只需要先加一个b,再取模行了,应该都知道吧) 1 #include <cstdio> 2 #include <cstdlib> 3 #inclu

洛谷——P1082 同余方程

P1082 同余方程 题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正整数 x0,即最小正整数解.输入数据保证一定有解. 输入输出样例 输入样例#1: 3 10 输出样例#1: 7 说明 [数据范围] 对于 40%的数据,2 ≤b≤ 1,000: 对于 60%的数据,2 ≤b≤ 50,000,000: 对于 100%的数据,2 ≤a, b≤ 2,

P1082 同余方程(扩欧模板)

https://www.luogu.org/problem/P1082 #include <iostream> #include <cstdio> #include <queue> #include <algorithm> #include <cmath> #include <cstring> #define inf 2147483647 #define N 1000010 #define p(a) putchar(a) #defin

洛谷P1082 同余方程

题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正整数 x0,即最小正整数解.输入数据保证一定有解. 输入输出样例 输入样例#1: 3 10 输出样例#1: 7 说明 [数据范围] 对于 40%的数据,2 ≤b≤ 1,000: 对于 60%的数据,2 ≤b≤ 50,000,000: 对于 100%的数据,2 ≤a, b≤ 2,000,000,000

洛谷 P1082 同余方程

题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正整数 x0,即最小正整数解.输入数据保证一定有解. 输入输出样例 输入样例#1: 3 10 输出样例#1: 7 说明 [数据范围] 对于 40%的数据,2 ≤b≤ 1,000: 对于 60%的数据,2 ≤b≤ 50,000,000: 对于 100%的数据,2 ≤a, b≤ 2,000,000,000

[NOIP2012] 提高组 洛谷P1082 同余方程

题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正整数 x0,即最小正整数解.输入数据保证一定有解. 输入输出样例 输入样例#1: 3 10 输出样例#1: 7 说明 [数据范围] 对于 40%的数据,2 ≤b≤ 1,000: 对于 60%的数据,2 ≤b≤ 50,000,000: 对于 100%的数据,2 ≤a, b≤ 2,000,000,000

NOIP2012 同余方程 题解

描写叙述 求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解. 格式 输入格式 输入仅仅有一行,包括两个正整数a, b,用一个空格隔开. 输出格式 输出仅仅有一行,包括一个正整数x0.即最小正整数解. 输入数据保证一定有解. 例子1 例子输入1[复制] 3 10 例子输出1[复制] 7 限制 每一个測试点1s 提示 对于40%的数据,2 ≤b≤ 1,000: 对于60%的数据,2 ≤b≤ 50,000,000: 对于100%的数据,2 ≤a, b≤ 2,000,000,000. 分析:

Luogu P4014 分配问题 题解

闲扯 蒟蒻的第一道自己想出怎么建图的题!!虽然是一个没什么技术含量的图 想了想,还是写篇题解纪念一下. 题面 题面 Solution 要求最小费用和最大费用,同时限制了流量,考虑费用流. 虚拟一个超级源点,从这个点分别向 \(N\) 个任务连一条流量为 \(1\) ,费用为 \(0\) 的边. 虚拟一个超级汇点,才从 \(N\) 个物品分别向该点连一条流量为 \(1\) ,费用为 \(0\) 的边. 因为每个人只能做一件,且每个工作只能做一次,所以连的边流量都为一.而第 \(i\) 个人做第 \