第六章 數學問題 -------- 6.10 特殊的同餘方程—逆元
逆元:
同餘方程 ax≡1(mod n),gcd(a,n) = 1 時有解,這時稱求出的 x 為 a 的對模n的乘法逆元。(注意:如果gcd(a,n)如果不等於1則無解),解法還是利用擴充套件歐幾里得演算法求解方程 ax + ny = 1 求出 x。
/**
* 求逆元
* ax = 1 (% mo),gcd(a,mo)=1
* ax+mo*y=1
* */
public static long inverseElement(long a, long mo) throws Exception {
long d = linearEquation(a, mo, 1);//ax+mo*y=1
x = (x % mo + mo) % mo;//保證x>0
return d;
}
題目:HDU-1576
思路:
設(A/B)%9973 = k, 則A/B = k + 9973x (x未知), 因此A = kB + 9973xB,又A%9973 = n, 所以kB%9973 = n, 故kB = n + 9973y (y未知),故(k/n)B +(-y/n)*9973 = gcd(B,9973) = 1擴充套件歐幾里得 求出k/n, 再乘以個n,記得取模,就是answer了。
程式碼:
import java.util.Scanner;
/**
* (A/B)%9973,求餘,除法不滿足交換性,可改為求B關於9973的逆元x,
* 這樣結果等價於Ax%9973等價於x*A%9973等價於xn%9973,
*/
public class HDU1576 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt();
for (int i = 0; i < T; i++) {
int n = scanner.nextInt();
int b = scanner.nextInt();
try {
MyGcd.inverseElement(b, 9973);
long x = MyGcd.x;
System.out.println(x*n%9973);
} catch (Exception e) {
// TODO: handle exception
}
}
}
private static class MyGcd{
static long x;
static long y;
public static long gcd(long m, long n) {
return n == 0 ? m : gcd(n, m % n);
}
public static long ext_gcd(long a,long b){
if (b==0) {
x = 1;
y = 0;
return a;
}
long res = ext_gcd(b, a % b);
long x1 = x;
x = y;
y = x1 - a / b * y;
return res;
}
public static long linearEquation(long a, long b, long m) throws Exception {
long d = ext_gcd(a, b);
if (m % d != 0) {
throw new Exception("無解");
}
long n = m / d;
x *= n;
y *= n;
return d;
}
public static long inverseElement(long a, long mo) throws Exception {
long d = linearEquation(a, mo, 1);// ax+mo*y=1
x = (x % mo + mo) % mo;// 保證x>0
return d;
}
}
}
結果:
相關文章
- [學習筆記] 丟番圖方程 & 同餘 & 逆元 - 數論筆記
- 第六章 數學問題 -------- 6.9 天平稱重問題【線性同餘方程】青蛙的約會
- 第六章 數學問題 -------- 6.11【同餘方程組】POJ1006 生理週期
- 數論學習筆記 (5):同餘與逆元筆記
- 【組合數學】遞推方程 ( 有重根遞推方程求解問題 | 問題提出 )
- 初等數論——同餘
- 第六章 數學問題 -------- 6.12 素數及質因數分解
- 第六章 數學問題 ----------6.13 素數的篩法(第十萬零二個素數)
- 第六章 數學問題 -------- 6.1【巧用進位制】天平稱重問題
- P1082 [NOIP2012 提高組] 同餘方程 尤拉定理
- 數學趣題:丟番圖方程(二)
- 一道求餘數小學數學題的解法
- 第六章 數學問題 -------- 6.14 【快速冪】斐波那契數列
- 第六章 數學問題 -------- 6.2【Nim遊戲】高僧鬥法遊戲
- 組合數的逆元求法
- 第六章:線性方程與最大公因數(1)
- 第六章:線性方程與最大公因數(2)
- 同餘
- 第六章 數學問題 -------- 6.4 演算法必備求和公式演算法公式
- MySQL:一個特殊的問題MySql
- 第3章 同餘式 -《資訊保安數學基礎》
- 餘數的餘數
- 同餘最短路學習筆記筆記
- 【演算法學習】同餘最短路演算法
- 幫餘晟同學打個廣告
- vue 變數賦值同時改變的問題Vue變數賦值
- 乘法逆元及逆元求法
- 一名大專同學的四個問題
- 第六章 數學問題 -------- 6.5 歐幾里得演算法及其擴充套件演算法套件
- 6.10
- 初等數論——素數,逆元,EXGCD有關GC
- 第六章 數學問題 -------- 6.7【擴充套件歐幾里得】一步之遙套件
- N-S方程問題有解了?與黎曼猜想並列,千禧年數學難題勝利在望
- LeetCode數學問題(Python)LeetCodePython
- Hive SQL必刷練習題:同時線上人數問題(*****)HiveSQL
- [20191204]sqlplus特殊定義導致的問題.txtSQL
- 組合數學筆記-特殊計數數列筆記
- Python小白的數學建模課-09 微分方程模型Python模型