题解 | #整除问题# 分解质因数

整除问题

https://www.nowcoder.com/practice/8e29045de1c84d349b43fdb123ab586a

// 思路:线性筛选质因数,即任意正整数(n,a>1)都可以被分解为有限个质数之积
// 如:12 = 2^2 * 3
// map可以用下标访问,而set不行
#include <bits/stdc++.h>
using namespace std;
#define INF 0x7fffffff
// 统计num中质因子的数量
void getAllFacs(unordered_map<int, int>& fac_n, int num) {
    for (int i = 2; i <= sqrt(num);i++) { // 上界有等号
        if (num <= 1) return;
        while (num % i == 0) { // num = faci^n * facj^m * ...?: 质因子分解方法
            fac_n[i]++;
            num /= i;
        }
    }
    if (num > 1) fac_n[num]++;
}
int main() {
    int n, a, k = INF;
    cin >> n >> a;
    unordered_map<int, int> fac_2toN, fac_a; // 散列表存储质因数
    getAllFacs(fac_a, a); // 对a分解质因数
    for (int i = 2; i <= n; i++) getAllFacs(fac_2toN, i); // 对2~n分解质因数
    for (int i = 2; i <= a; i++) { // 开始比较质因子次方 选出做小的作为 k
        if (fac_a[i] != 0) {
            if(fac_2toN[i]/fac_a[i] < k) k=fac_2toN[i]/fac_a[i];
        }
    }
    cout << k << endl;
    return 0;
}

全部评论

相关推荐

2025-12-19 21:53
门头沟学院 Java
想做OpenGL:不要一来就把自己定位这么低吧,把大厂当成目标,不断去学技术做项目,最后你至少能学到能找到中小厂的技术水平,你一上来就找这种两千块还要前后端都会的,其实对你用处不会很大,真去了也是打杂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务