zoukankan      html  css  js  c++  java
  • Codeforces 300E(数学)

    题意:给定k个数字,求最小的正整数n,使得“n的阶乘”是“这k个数字的阶乘的积”的倍数。1<=k<=1e6,数字ai满足1<=ai<=1e7

    分析:如果我们能对着k个数字的阶乘的结果分解质因数,那么就可以根据每个质因数的指数来二分最后的答案

       问题的关键就是如何分解a1!a2!a3!a4!.....

       先可以预处理出1..MAX每个数在式子中出现了多少次(对于ai,也就是1~ai中间所有数字出现次数+1),这可以用差分做

       我们知道了cnt[1..MAX]后,接下来就是考虑分解了

       我们从大到小枚举每个数字x

          如果x是合数,我们可以把x分解成一个质因数和另外一个数的乘积,于是我们可以把x位置的次数加到那两个位置上。并且x位置的次数设为0

          如果x是素数,则跳过

       那么最后,每个素数对应的出现总次数就算出来了

       这样是O(n)的

       对于一个数字x的质因数,我们可以在欧拉筛的时候记一下,可以记一下最小的质因数

       欧拉筛也是O(n)的

  • 相关阅读:
    jar 反编译工具
    SpringBoot 中注解方式的拦截过滤
    jetty 启动项目在pom.xml 的配置
    java Exception 处理汇总
    mysql-覆盖索引
    程序员为何如此累
    启动centos 不带桌面
    Linux 和 Vim 常用命令整理
    How to Use tomcat on Linux
    Mac Book 问题汇集
  • 原文地址:https://www.cnblogs.com/wmrv587/p/6549842.html
Copyright © 2011-2022 走看看