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(); } }
相关文章推荐
- HDU - 1576 A/B 乘法逆元 扩展欧几里德
- HDU 1576扩展欧几里德(2013.10.20周赛D题)
- Hdu1576 A-A/B 扩展欧几里德
- HDU 1576 A/B 欧几里德扩展方程
- A/B HDU - 1576 (扩展欧几里德)
- HDU 1576 A/B(扩展欧几里德变形)
- [HDU](1576) A/B ----扩展欧几里德(数论)
- HDU 1576 A/B [扩展欧几里德]
- HDU 1576 A/B(扩展欧几里德变形)
- HDU - 1576 - A/B(扩展欧几里德)
- HDU 1576 A/B(扩展欧几里德变形)
- hdu 1576 A/B 扩展欧几里德
- hdu 1576 A/B(扩展欧几里德)
- hdu 1576 A/B (扩展欧几里德简单运用)
- HDU 1222 欧几里德公式扩展
- HDU - 1576 A/B 扩展欧几里得
- HDU 1576 A/B(扩展欧几里得,思维)
- hdu 1576 A/B 欧几里德算法的扩展
- 扩展欧几里得算法的应用 POJ 2115 POJ 2142 POJ 1061 HDU 2669 HDU 1576 SGU 106
- hdu1576(A/B)扩展欧几里得