数论 约数 求一个数所有约数个数

AcWing 870. 约数个数
由于我是我们队的数论选手,寒假刷题会略偏向于数论方面QWQ,在此记录 2021-01-12 刷题打卡~
在这里插入图片描述
思路分析:
任何正整数可以表示为 N = P1 ^ α1 * P2 ^ α2 * P3 ^ α3 * … * Pk ^ αk (P为质数)
则该数N所拥有的约数个数为 (α1 +1)* (α2 +1) * (α3 +1) *… * (αk +1)
在这里插入图片描述
AC代码:

#include <bits/stdc++.h>

#define ll long long
using namespace std;
const int mod = 1e9 + 7;
unordered_map<int,int> primes;

int main() {
    
    
    int n;
    cin >> n;
    while(n--) {
    
    
        int x;
        cin >> x;
        // 试除法筛质数
        for(int i = 2; i <= x / i; i++) {
    
    
            while (x % i == 0) {
    
    
                x /= i;
                primes[i]++;
            }
        }
        // 避免存在一个大于 sqrt(x) 的约数
        if(x > 1)
            primes[x]++;
    }
    ll res = 1;
    // 根据前面的结论,遍历hashmap,然后得出答案
    for(auto prime : primes)
        res = res * (prime.second + 1) % mod;
    cout << res << endl;
    return 0;
}

最后补两个东西
关联容器:unordered_map详细介绍(附可运行代码)
c++中map与unordered_map的区别

猜你喜欢

转载自blog.csdn.net/qq_45654671/article/details/112550620