您的位置:首页 > 编程语言 > Java开发

HDU 1576 A/B 扩展欧几里德 Java

2017-08-04 22:31 323 查看
典型的利用扩展欧几里德算法求解模的逆元!!!

【请点击蓝色字体,查看算法详情】

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

/**
* 题意:中文题,不解析!!!
*
* 扩展欧几里德原理求解模的逆元,当然可以当作模线性方程去求解。
*
* 解法:由 (A/B)%9973 = x 得 A = B * x
*       所以 n = A % 9973 --> n = B*x % 9973 --> B*x ≡ n(mod 9973)
*       接下来典型的求解模线性方程。
*
* @author TinyDolphin
*/
public class Main {

private static int x;
private static int y;
private static int exgcd(int a, int b) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
int d = exgcd(b, a % b);
int temp = x;
x = y;
y = temp - a / b * y;
return d;
}

public static void main(String[] args) throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
int T;
int N;
int B;
int a;
int b;
int n;
int d;
while (in.nextToken() != StreamTokenizer.TT_EOF) {
T = (int) in.nval;
while (T-- != 0) {
in.nextToken();
N = (int) in.nval;
in.nextToken();
B = (int) in.nval;
a = B;
b = N;
n = 9973;
d = exgcd(a, n);   // 题意已给出,d = gcd(B,9973) = 1
// 扩展欧几里德算法求解模线性方程中的 定理一
x = x * (b / d) % n;
// 扩展欧几里德算法求解模线性方程中的 定理二
// 注意:得出的 x 可能是负数,需要求最小的正整数解,所以需要 ((x + n/d ) % n/d
x = (x + n / d) % (n / d);
out.println(x);
}
}
out.flush();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: