约数之和2022-04-06

题目连接:约数之和

假设现在有两个自然数 A 和 B,S 是 AB 的所有约数之和。

请你求出S\ \% \ mod的值是多少。

输入格式

在一行中输入用空格隔开的两个整数 A 和 B。

输出格式

输出一个整数,代表S\ mod \ 9901 的值。

数据范围

0≤A,B≤5×10^7

输入样例:

2 3

输出样例:

15

注意: A 和 B 不会同时为 0。

package basic.math04.recursion;

import java.util.Scanner;

/**
 * @author : sicaolong
 * @description :
 * @date : 2022/4/5  2:55 上午
 */
public class NumberOfDivisor {
    static int mod = 9901;

    static int quickMi(int a, int k) {
        int res = 1;
        a %= mod;   //a可能比较大 a*a 可能会爆int直接进行一次取模;
        while (k != 0) {
            //如果是奇数的话
            if ((k & 1) != 0) res = res * a % mod;
            a = a * a % mod;
            k >>= 1;
        }
        return res;
    }

    static int sum(int p, int k) {
        //1、1的时候
        if (k == 1) return 1;
        //2、是偶数的时候
        if ((k & 1) == 0) return (1 + quickMi(p, k / 2)) * sum(p, k / 2) % mod;

        //3、是奇数的时候  把最后一项拿出去;
        return (sum(p, k - 1) + quickMi(p, k - 1)) % mod;
    }

    public static void main(String[] args) {
        int a, b;
        Scanner sc = new Scanner(System.in);
        a = sc.nextInt();
        b = sc.nextInt();
        int res = 1;
        // 对a 进行分解质因数
        for (int i = 2; i * i <= a; i++) {
            if (a % i == 0) {
                int s = 0;
                while (a % i == 0) {
                    a /= i;
                    s++;
                }
                res = res * sum(i, b * s + 1) % mod;
            }
        }
        if (a > 1) res = res * sum(a, b + 1) % mod;
        if (a == 0) res = 0;
        System.out.println(res);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容