一阶线性同余方程 逆

news/2025/2/13 19:58:36/文章来源:https://www.cnblogs.com/ChengZHWang/p/18714323

一阶线性同余方程

给定 \(a,b,m\) ,求整数 \(x\) ,满足 \(ax\equiv b\ (mod \ m)\)

这说明 \(ax-b\)\(m\) 的倍数,设为 \(-y\) 倍,这就得到二元线性丢番图方程 \(ax+my=b\)

所以,求解一阶线性同余方程等价于二元线性丢番图方程。

定理

\(a,b,m\in N\)\(m>0\)\((a,m)=d\)

\(d\nmid b\) ,则 \(ax\equiv b\ (mod \ m)\) 无解。

\(d\mid b\) ,则 \(ax\equiv b\ (mod \ m)\)\(d\) 个模 \(m\) 不同余的解。

推论

$a $ 和 \(m\) 互质时,因为 \(d=(a,m)=1\) ,所以线性同余方程 \(ax\equiv b\ (mod \ m)\) 有唯一的模 \(m\) 不同余的解。

这条推论在求解同余方程有很重要的作用。先求逆,再用逆求 \(x\)


(一)求单个逆

扩展欧几里得

对于 \(ax\equiv1\ (mod \ m)\) ,即丢番图方程 \(ax+my=1\) ,

先用扩展欧几里得算法算出 \(ax+my=1\) 的一个特解 \(x_0\) ,通解 \(x=x_0+mn\)

若要求最小整数解,则 \(x=((x_0\ mod \ m) + m)\ mod \ m\)

费马小定理

快速幂求逆元 费马小定理 - AKgrid - 博客园

(二)求多个逆

若要求 \(1\sim n\)\(p\) 所有的逆,用递推法。时间复杂度 \(O(n)\)

首先,\(i=1\) 时,\(i^{-1} = 1\) 。当 \(i > 1\) 时,

(1)设 \(p/i=k\) ,余数为 \(r\) ,所以 \(k\ \cdot\ i+r\equiv0\ (mod\ p)\)

(2)等式两边同乘 \(i^{-1} \ \cdot\ r^{-1}\) ,得 \(k\ \cdot\ r^{-1} +i^{-1}\equiv 0\ (mod\ p)\)

(3)移项得 \(i^{-1}\equiv-k\ \cdot\ r^{-1}\ (mod\ p)\) ,代入 \(k=p/i\) ,得 \(i^{-1}\equiv-p/i\ \cdot\ r^{-1}\ (mod\ p)\) ;

(4)由于 \(0\equiv p\ (mod \ p)\) ,叠加后得到 \(i^{-1}\equiv(p-p/i)\ \cdot\ r^{-1}\ (mod\ p)\)

(三)用逆求解同余方程

对于 \(ax\equiv b\ (mod \ m)\),直接两边同时乘 \(a^{-1}\) ,就得到方程的解 \(x\equiv a^{-1}b\ (mod \ m)\)

其中,\(a\ \cdot\ a^{-1}\equiv 1\ (mod\ m)\),可以利用这一点简单求逆。

例如,\(8x\equiv 22\ (mod\ 31)\) ,两边同时乘以 \(8\)\(31\) 的逆 \(4\)\(8 \times 4 \equiv 1 \ (mod \ 31)\) ),得到 \(x\equiv 88\ (mod \ 31)\equiv 26\ (mod \ 31)\)


[AcWing878] 线性同余方程

题目描述

给定 \(n\) 组数据 \(a_i,b_i,m_i\),对于每组数求出一个 \(x_i\),使其满足 \(a_i \times x_i \equiv b_i \pmod {m_i}\),如果无解则输出 impossible

输入格式

第一行包含整数 \(n\)

接下来 \(n\) 行,每行包含一组数据 \(a_i,b_i,m_i\)

输出格式

输出共 \(n\) 行,每组数据输出一个整数表示一个满足条件的 \(x_i\),如果无解则输出 impossible

每组数据结果占一行,结果可能不唯一,输出任意一个满足条件的结果均可。

输出答案必须在 \(int\) 范围之内。

数据范围

\(1 \le n \le 10^5\),
\(1 \le a_i,b_i,m_i \le 2 \times 10^9\)

输入样例:

2
2 3 6
4 3 5

输出样例:

impossible
-3

算法

注意结果开 \(long \ long\)

C++ 代码

#include<bits/stdc++.h>
using namespace std;
int n, x, y;
using LL = long long ;
int exgcd(int a, int b, int &x, int &y)
{if (!b){x = 1, y = 0;return a;}int x1, y1;int d = exgcd(b, a % b, x1, y1);x = y1, y = x1 - a / b * y1;return d;
}int main()
{cin >> n;while (n --){int a, b, m;cin >> a >> b >> m;int d = exgcd(a, m, x, y);if (b % d) puts("impossible");else {x = (LL)x * b / d % m;cout << x << endl;}}return 0;
}

P3811 【模板】模意义下的乘法逆元

题目背景

这是一道模板题

题目描述

给定 \(n,p\)\(1\sim n\) 中所有整数在模 \(p\) 意义下的乘法逆元。

这里 \(a\)\(p\) 的乘法逆元定义为 \(ax\equiv1\pmod p\) 的解。

输入格式

一行两个正整数 \(n,p\)

输出格式

输出 \(n\) 行,第 \(i\) 行表示 \(i\) 在模 \(p\) 下的乘法逆元。

输入输出样例 #1

输入 #1

10 13

输出 #1

1
7
9
10
8
11
2
5
3
4

说明/提示

$ 1 \leq n \leq 3 \times 10 ^ 6\(,\)n < p < 20000528 $。

输入保证 $ p $ 为质数。

算法

模版题,线性求多个逆元。

代码

#include <iostream>
using namespace std;const int N = 3e6 + 10;
long inv[N];int main() {int n, p;scanf("%d%d", &n, &p);inv[1] = 1;puts("1");for (int i = 2; i <= n; i++)printf("%ld\n", inv[i] = (long)p - (p / i) * inv[p % i] % p);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/883376.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基环树 DP:学习笔记

总述 定义 基环树,是一个 \(N\) 个点和 \(N\) 条边的连通图,特征是图中有且仅有一个环。特别的,如果不连通且每个连通块的点数和边数都相等,那么这就是一个基环树森林。 基环树 DP,顾名思义,就是在一个基环树上 DP,或是 DP 的结构类似基环树。相对于正常的树型 DP,一般…

数字孪生如何让GIS场景视效瞬间高大上?带你了解鲸孪生中的GIS系统

GIS与数字孪生的结合非常紧密,而山海鲸可视化作为一个数字孪生平台,也将GIS系统整合在了鲸孪生功能之中。 GIS中包含了大量的数据,例如遥感数据、地形数据、倾斜摄影数据等,能够为数字孪生系统提供非常好的补充。同时,传统的GIS系统整体视觉效果相对较差,与其他模型和数据…

2 分支 多个思路

利用分支,你就可以在同一个代码基础上同时处理多个完全没有关联、相互独立的工作。考虑以下场景。 假设你正在改一个 Bug-A,此时已经产生了大量的代码修改,并且离修复完成还有很长一段时间(起码得明天)。此时,有一个着急但简单的 Bug-B 需要你立即完成,并在一个小时内同…

记录一种DAG计数方法与一个配套技巧

记录一种DAG计数方法与一个配套技巧 定义 \(f_S\) 表示集合 \(S\) 中的点构成的合法 DAG 子图的方案数。假设找到 DAG 中一个入度为 \(0\) 的节点 \(x\),那么很明显 \(f_S=\sum_{x}f_{S\setminus \{x\}}\),这明显要算重因为 \(S\setminus \{x\}\) 中也有入度为 \(0\) 的点。 …

野鸡题手写题解整合

浴谷正在蒸蒸日上,专栏区怕是马上要倒闭了。 CF2026F 题 题。题外话:这场有点水平,E 题让我重拾了最大权闭合子图的记忆。 首先考虑没有这个可持久化(只有 \(2,3,4\) 操作)怎么做。\(0/1\) 背包问题,动态维护当前的 dp 数组 \(f_i\) 表示总体积 \(\sum p\) 不超过 \(i\) …

鸿蒙开发:了解@Builder装饰器

@Builder装饰是鸿蒙UI开发中,非常重要的一个装饰器,在实际的开发中,合理且正确的使用,能够让我们的代码更加的简洁前言本文代码案例基于Api13,温馨提示:内容相对来说比较简单,如果您已掌握,略过即可。如果说一个页面中组件有很多,我们都统一写到build函数中,显而易见…

P1020 [NOIP 1999 提高组] 导弹拦截(dilworth)

这道题真的做的我鬼火冒,尤其是这个第二问要用到dilworth但是我看讲解完全不知道他们在讲什么,我看了好久才理解,一个数组至少可以由几个不增子序列覆盖就等于严格单调递增的最长子序列的长度,如果是至少可以由几个严格递减子序列覆盖就等于最长单调不减子序列的长度,然后…

Linux系统介绍

1. Linux介绍 Linux和windows一样也是一个操作系统,但是与windows不同的是,Linux是一套开放源码的代码程序、并且可以自由传播的类unix操作系统软件。 Linux系统主要被应用于服务端、嵌入式开发和个人PC桌面3大领域,一般的WEB项目都是部署在Linux操作系统上。 Linux是一个基…

Linux驱动---按键

文章简述了Input子系统架构,讲解了输入设备驱动开发流程,探讨了按键消抖方法及按键驱动开发要点,为嵌入式开发提供参考。目录一、Input子系统1.1、简介1.2、Input子系统构成1.3、input_dev结构体二、输入设备驱动开发流程2.1、分配和初始化输入设备2.2、注册设备2.3、事件上…

Android studio:flutter开发环境配置

Make Android apps | Flutter 下载flutter,并配置环境变量 右击 此电脑->属性->高级系统设置->环境变量在 用户变量 新建两个变量 变量名:FLUTTER_STORAGE_BASE_URL 变量值:https://storage.flutter-io.cn 变量名:PUB_HOSTED_URL 变量值:https://pub.flutter-io.c…