题解 | #整除问题#

整除问题

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

#include <map>
#include <string>
#include <iostream>
#include <cctype>
#include <stack>
#include <vector>
using namespace std;
//判断x是不是质数
bool isprime(int x) {
    if (x == 2) return true;
    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0) return false;
    }
    return true;
}
int main() {
    //注意:质因数我们不考虑1
    int n, a;
    while (cin >> n >> a) {
        vector<int>aa(1000, 0);//存储a的质因数 aa[i]代表质因数i有aa[i]个
        vector<int>nn(1000, 0);//存储n的阶乘的所有质因数
        //求解a的质因数
        int tt = a;
        for (int i = 2; i * i <= a; i++) {
            if (isprime(i))
                while (tt % i == 0) {
                    aa[i]++;
                    tt /= i;
                }
        }
        //注意要检查一下最后的t是不是1,如果不是1,一定是一个质数,后面判断其实可以省略
        //举个例子 将26分解 2*13,tt=13,13还没被检测出来就跳出循环了,所以循环出来要判断一下
        //相反,如果是12,分解为2*2*3,出来的时候tt是1,所以不必处理
        if (tt != 1 && isprime(tt)) aa[tt]++;
        //求解2~n的质因数 ---与求解a的质因数类似,只是需要求解2到n每一个数的质因数,进行叠加
        for (int j = 2; j <= n; j++) {

            int t = j;
            for (int i = 2; i * i <= j; i++) {

                if (isprime(i))

                    while (t % i == 0) {
                        nn[i]++;
                        t /= i;
                        if (t == i) break;//如果最后分解的结果是两个质数相乘,跳出即可
                    }
            }
            if (t != 1 && isprime(t)) nn[t]++;
        }
        int k = 0;
        //举个例子 a是2*5 n!=2*3*4**5*6=2*3*2*2*5*2*3
        //我们尝试去遍历a的每一个质因子,然后看看n!对应的质因子数目是a的多少倍,k就是其中的最小值,类似于短板效应
        //比如a有一个质因子2,一个质因子5,而n!虽然有4个质因子2,却只有一个质因子5,显然k应取决于质因子5的倍数关系,k至少也是0,所以初始化为0
        for (int i = 0; i < 1000; i++) {
            if (aa[i] > 0) {
                if (k == 0) k = nn[i] / aa[i];
                else k = min(nn[i] / aa[i], k);
            }
        }
        cout << k << endl;
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

面试官全程关摄像头1.自我介绍一下2.React和Vue哪个更熟悉一点3.你在之前那段实习经历中有没有什么技术性的突破(我只是实习了44天工作28天,我把我能说的都说了)4.你封装的哪个表单组件支不支持动态传值5.自己在实习阶段Vue3项目封装过hook吗6.hook有什么作用7.Vue2和Vue3的响应式区别(我说一个是proxy是拦截所有的底层操作,Object.defineProperty本身就是一个底层操作,有些东西拦截不了,比如数组的一些操作还有等等,面试官就说实在要拦截能不能拦截????我心想肯定不行呀,他的底层机制就不允许吧)8.pinia和vuex的区别(这个回答不出来是我太久没用了)9.pinia和zustand的区别,怎么选(直接给我干懵了)(我说react能用pinia吗&nbsp;&nbsp;他说要用的话也可以)10.渲染一万条数据,怎么解决页面卡顿问题(我说分页、监听滚轮动态加载,纯数据展示好像还可以用canvas画)(估计是没说虚拟表单,感觉不满意)11.type和interface的区别12.ts的泛型有哪些作用(我就说了一个结构相同但是类型不同的时候可以用,比如请求响应的接口,每次的data不同,这里能用一个泛型,他问我还有什么)13.你项目用的是React,如果让你再写一遍你会选择什么14.pnpm、npm、yarn的区别15.dependencies和devdependencies的区别总而言之太久没面试了,上一段实习的面试js问了很多。结果这次js一点没问,网络方面也没考,表现得很一般,但是知道自己的问题了&nbsp;&nbsp;好好准备,等待明天的影石360和周四的腾讯了&nbsp;&nbsp;加油!!!
解zj:大三的第一段面试居然是这样的结局
查看15道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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