傅芳杰

个人博客

You Deserve The Best


约数

判断一个数的所有约数

ydIs0J.png

求一个数的约数个数

ydXmkD.png

求一个数的约数之和

ydXV0K.png

求两个数最大公约数

ydI06U.png

求两个数最小公倍数

ydXnte.png

AcWing 869. 试除法求约数 原题链接

给定n个正整数aiai,对于每个整数aiai,请你按照从小到大的顺序输出它的所有约数。

输入格式

第一行包含整数n。

接下来n行,每行包含一个整数aiai。

输出格式

输出共n行,其中第 i 行输出第 i 个整数aiai的所有约数。

数据范围

1≤n≤1001≤n≤100, 2≤ai≤2∗1092≤ai≤2∗109

输入样例:

2
6
8

输出样例:

1 2 3 6 
1 2 4 8 
    static int[] divisor;
    static int count;
    public static void main(String[] args) {
        int n = in.nextInt();
        divisor = new int[800_0000];
        while (n-- > 0) {
            count = 0;
            approximate(in.nextInt());
            Arrays.sort(divisor, 0, count);
            for (int i = 0; i < count; i++) {
                out.print(divisor[i] + " ");
            }
            out.println();
        }
        out.flush();
        out.close();
    }

    private static void approximate(int x) {
        for (int i = 1; i <= x / i; i++) {
            if (x % i == 0) {
                divisor[count++] = i;
                if (i != x / i) {
                    divisor[count++] = x / i;
                }
            }
        }
    }

AcWing 870. 约数个数 原题链接

给定n个正整数aiai,请你输出这些数的乘积的约数个数,答案对109+7109+7取模。

输入格式

第一行包含整数n。

接下来n行,每行包含一个整数aiai。

输出格式

输出一个整数,表示所给正整数的乘积的约数个数,答案需对109+7109+7取模。

数据范围

1≤n≤1001≤n≤100, 1≤ai≤2∗1091≤ai≤2∗109

输入样例:

3
2
6
8

输出样例:

12
    static int mod = (int) (1e9 + 7);
    static Map<Integer, Integer> map = new HashMap<>();
    public static void sum(int x) {
        //先进行质因数 分解
        for (int i = 2; i <= x / i; i++) {
            if (x % i == 0) {
                int s = 0;
                while (x % i == 0) {
                    s++;
                    x /= i;
                }
                map.put(i, map.getOrDefault(i, 0) + s);
            }
        }
        if (x > 1) {
            map.put(x, map.getOrDefault(x, 0) + 1);
        }
    }
    public static void main(String[] args) {
        int n = in.nextInt();
        long res = 1L;
        while (n-- > 0) {
            sum(in.nextInt());
        }
        Collection<Integer> values = map.values();
        for (Integer v : values) {
            res = (res * (v + 1)) % mod;
        }
        out.println(res);
        out.flush();
        out.close();
    }

AcWing 871. 约数之和 原题链接

给定n个正整数aiai,请你输出这些数的乘积的约数之和,答案对109+7109+7取模。

输入格式

第一行包含整数n。

接下来n行,每行包含一个整数aiai。

输出格式

输出一个整数,表示所给正整数的乘积的约数之和,答案需对109+7109+7取模。

数据范围

1≤n≤1001≤n≤100, 1≤ai≤2∗1091≤ai≤2∗109

输入样例:

3
2
6
8

输出样例:

252
    static int mod = (int) (1e9 + 7);
    static Map<Integer, Integer> map = new HashMap<>();
    public static void sum(int x) {
        //先进行质因数 分解
        for (int i = 2; i <= x / i; i++) {
            if (x % i == 0) {
                int s = 0;
                while (x % i == 0) {
                    s++;
                    x /= i;
                }
                map.put(i, map.getOrDefault(i, 0) + s);
            }
        }
        if (x > 1) {
            map.put(x, map.getOrDefault(x, 0) + 1);
        }
    }
    public static void main(String[] args) {
        int n = in.nextInt();
        long res = 1L;
        while (n-- > 0) {
            sum(in.nextInt());
        }
        Set<Map.Entry<Integer, Integer>> entries = map.entrySet();
        for (Map.Entry<Integer, Integer> e : entries) {
            int p = e.getKey();
            int mul = e.getValue();
            long t = 0L;
            for (int i = 0; i <= mul; i++) {
                t = (t * p + 1) % mod;
            }
            res = res * t % mod;
        }
        out.println(res);
        out.flush();
        out.close();
    }

AcWing 872. 最大公约数 原题链接

给定n对正整数ai,biai,bi,请你求出每对数的最大公约数。

输入格式

第一行包含整数n。

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

输出格式

输出共n行,每行输出一个整数对的最大公约数。

数据范围

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

输入样例:

2
3 6
4 6

输出样例:

3
2
    public static int gcd(int a, int b) {
        return b == 0 ? a : gcd(b, a % b);
    }