(约数)试除法求约数\约数个数\约数之和板子

1.试除法求约数

#include <bits/stdc++.h>
using namespace std;

int n, a;
vector<int> res;

signed main(){
    scanf("%d", &n);
    while(n--){
        res.clear();
        scanf("%d", &a);
        for(int i = 1; i <= a / i; ++i){
            if(a % i == 0){
                if(i != a / i) {res.push_back(i);res.push_back(a/i);}
                else res.push_back(i);
            }
        }
        sort(res.begin(), res.end());
        for(auto it : res) printf("%d ", it);
        puts("");
    }

    
    return 0;
}

2. 约数个数

一个数的约数是由这个数的几个质因子相乘得到的。

#include <bits/stdc++.h>
using namespace std;

const long long mod = 1e9 + 7;

int n, a;
unordered_map<int, int> mp;

signed main(){
    scanf("%d", &n);
    while(n--){
        scanf("%d", &a);
        for(int i = 2; i <= a / i; ++i){
            if(a % i == 0){
                while(a % i == 0){
                    a /= i;
                    ++mp[i];
                }
            }
        }
        if(a > 1) ++mp[a];
    }
    long long res = 1;
    for(auto it: mp){
        res = res * (it.second + 1) % mod;
    }
    
    printf("%lld\n", res);
    
    return 0;
}

3.约数之和

#include <bits/stdc++.h>
using namespace std;

const long long mod = 1e9 + 7;

int n, a;
unordered_map<int, int> mp;

signed main(){
    scanf("%d", &n);
    while(n--){
        scanf("%d", &a);
        for(int i = 2; i <= a / i; ++i){
            if(a % i == 0){
                while(a % i == 0){
                    ++mp[i];
                    a /= i;
                }
            }
        }
        if(a > 1) ++mp[a];
    }
    long long res = 1;
    for(auto item : mp){
        long long tmp = 1;
        while(item.second--) tmp = ((tmp * item.first) + 1) % mod;
        res = res * tmp % mod;
    }
    printf("%lld\n", res);
    
    return 0;
}
posted @ 2025-04-05 20:37  awei040519  阅读(8)  评论(0)    收藏  举报