1 条题解

  • 0
    @ 2025-5-11 13:00:20

    求约数和和约数个数


    对于: N=p1c1p2c2...pkckN=p1^{c1} * p2^{c2} * ...*pk^{ck}

    此时约数个数为:(c1+1)(c2+1)(ck+1)(c1+1)*(c2+1)*…(ck+1)

    此时的约数之和为:$(p1^0+p1^1+...p1^{c1}) * ...*(pk^0+pk^1+...+pk^{ck})$ 那么求约数之和就可以转变为:

    while(b--){
    	t=(t*p+1)%mod;
    }
    

    即通过迭代法求约数和(也可以用等比数列的求和公式求,涉及到逆元的知识),即:
    t=tp+1t=t*p+1

    t=1t=1

    t=p+1t=p+1

    t=p2+p+1t=p^2+p+1

    t=pb+pb1+...+1t=p^b+p^{b-1}+...+1
    核心代码如下:

    const int mod = 1e9 + 7;
    const int N = 200;
    int n;
    int a[N];
    map<int, int> mp;//
    void decompose(int num) {
        for (int i = 2; i * i <= num; i++) {
            while (num % i == 0) {
                num /= i;
                mp[i]++;
            }
        }
        if (num > 1) mp[num]++;
    }
    
    int divsum(){
    	int res=1;
    	for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++) {
            int a = it->first, b = it->second;
            int t = 1;
            while (b--) {
                t = (t * a + 1) % mod;
            }
            res = res * t % mod;
        }
        return res;
    }
    /*若要求约数个数:
    	ans=1;
    	for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++){
    		int a = it->first, b = it->second;
    		ans*=(b+1);
    	}
    	return ans;
    */
    
    • 1

    信息

    ID
    43
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    5
    已通过
    3
    上传者