傅芳杰

个人博客

You Deserve The Best


扩展欧几里得算法

裴蜀定理

ydIy79.png

扩展欧几里得算法

ydIUf0.png

线性同余方程

ydLcrV.png

AcWing 877. 扩展欧几里得算法 原题链接

给定nn对正整数ai,biai,bi,对于每对数,求出一组xi,yixi,yi,使其满足ai∗xi+bi∗yi=gcd(ai,bi)ai∗xi+bi∗yi=gcd(ai,bi)。

输入格式

第一行包含整数n。

接下来n行,每行包含两个整数ai,biai,bi。

输出格式

输出共n行,对于每组ai,biai,bi,求出一组满足条件的xi,yixi,yi,每组结果占一行。

本题答案不唯一,输出任意满足条件的xi,yixi,yi均可。

数据范围

1≤n≤1051≤n≤105, 1≤ai,bi≤2∗1091≤ai,bi≤2∗109

输入样例:

2
4 6
8 18

输出样例:

-1 1
-2 1
    static long x;
    static long y;
    public static long exgcd(long a, long b) {
        if (b == 0) {
            x = 1;
            y = 0;
            return a;
        }
        long d = exgcd(b, a % b);
        long tmp = x;
        x = y;
        y = tmp - a / b * y;
        return d;
    }
    public static void main(String[] args) {
        int n = in.nextInt();
        while (n-- > 0) {
            int a = in.nextInt();
            int b = in.nextInt();
            long d = exgcd(a, b);
            out.println(x + " " + y);
        }
        out.flush();
        out.close();
    }

AcWing 878. 线性同余方程 原题链接

给定nn组数据ai,bi,miai,bi,mi,对于每组数求出一个xixi,使其满足ai∗xi≡bi(mod mi)ai∗xi≡bi(mod mi),如果无解则输出impossible。

输入格式

第一行包含整数nn。

接下来nn行,每行包含一组数据ai,bi,miai,bi,mi。

输出格式

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

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

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

数据范围

1≤n≤1051≤n≤105, 1≤ai,bi,mi≤2∗1091≤ai,bi,mi≤2∗109

输入样例:

2
2 3 6
4 3 5

输出样例:

impossible
-3
    static int x;
    static int y;
    public static int exgcd(int a, int b) {
        if (b == 0) {
            x = 1;
            y = 0;
            return a;
        }
        int d = exgcd(b, a % b);
        int tmp = x;
        x = y;
        y = tmp - a / b * y;
        return d;
    }

    public static void main(String[] args) {
        int n = in.nextInt();
        while (n-- > 0) {
            int a = in.nextInt();
            int b = in.nextInt();
            int m = in.nextInt();
            int d = exgcd(a, m);
            if (b % d != 0) {
                out.println("impossible");
            }else {
                long res = (long) x * (b / d);
                out.println(res % m);
            }
        }
        out.flush();
        out.close();
    }