一般做组合数的题目都要进行质因数的分解,我们一般是for循环对每个数进行质因数分解,大多数情况都不会超时,但极少数的情况下,题目会不允许这样的做法,所以我们需要学会一种更快的方法来求质因数。

我们一般的方法是对每个数进行质因数分解:

inline void calc(int x,int val)
{
int xx=x;
for(int i=;i*i<=xx;i++)
{
while(x%i==)//不断进行除法,找出多少的当前的质数
{
c[i]+=val;x/=i;
}
if(x==)break;
}
if(x>)c[x]+=val;//如果剩下的数也是个质数,那么这个质数也要加上val
}

但如果想要更快的分解,我们可以直接对n!进行分解:

首先先进行素数筛选,得出素数表

然后进行如下操作:

 inline long long calc(int n,int x)//x表示想要求的质数,函数的作用是求出x的个数,n表示要求的n!(例:n=8表示8!)
{ long long cnt=;
for(long long i=x;i<=n;i*=x)//为了防止i的溢出,所以我们要开long long
{cnt+=n/i;
}
return cnt;
}

我们来一个样例说明一下:

1  2  3  4  5  6  7  8         我们求得在8!中2的个数

1      1      1      1         首先我们先计算出2的倍数的个数:8/2=4

            1              1         其次我们计算出4的倍数的个数:    8/4=2(上面一个式子求出了第一层,现在求第二层)

                            1         最后我们解出第三层的2的个数:    8/8=1

我们把4+2+1=7,所以一共7个2出现了。

 即:cnt(x)=[n/(x^1)]+[n/(x^2)]+[n/(x^3)]+...(直到x的次方大于n)

到这里我们可以发现:我们平时求的方法是一列一列求的(就是每一个数算一遍),而这个方法我们每一行每一行的求,虽然效果一样,但求起来速度很快。值得学习。

故做法:

  1.先把素数表打好

  2.for循环把小于n的每个质数进行一次运算,用数组记录

  3.结束

非常快。

快速求出n!的质因数的个数的更多相关文章

  1. JAVA输入一个整数,求出其所有质因数

    首先得求出能整除A的数,再判断I是否是质数!!! import java.util.*; public class aa { public static void main(String[] args ...

  2. tr循环,每行 2个数相加 求出和位第三个数赋值 (http://jsfiddle.net/hgeL44rz/113/)

    <table id="tb"> <tr> <th>单价</th> <th>数量</th> <th> ...

  3. 如何求出数组中最小(或者最大)的k个数(least k问题)

    输入n个整数,如何求出其中最小的k个数? 解法1. 当然最直观的思路是将数组排序,然后就可以找出其中最小的k个数了,时间复杂度以快速排序为例,是O(nlogn): 解法2. 借助划分(Partitio ...

  4. 对于给定的整数集合S,求出最大的d,使得a+b+c=d。

    对于给定的整数集合S,求出最大的d,使得a+b+c=d.a,b,c,d互不相同,且都属于S.集合的元素个数小于等于2000个,元素的取值范围在[-2^28,2^28 - 1],假定可用内存空间为100 ...

  5. 输入n个数组,数组长度不等,每个数组取出一个数进行组合,求出所有的组合。

    转载声明:原文转自http://www.cnblogs.com/xiezie/p/5511707.html 昨天晚上,有个朋友找到我,他在用matlab编程,但是遇到一个问题,解决不了. 问题如下: ...

  6. 快速判断&求出区间相交的长度

    有两个区间A[a1,b1], B[a2,b2],判断这两个区间有没有交集.我们可以分为两种思维来判断: /** *思路就是如果两个区间不相交,那么最大的开始端一定大于最小的结束端 **/ if(max ...

  7. CodeForces 702B Powers of Two【二分/lower_bound找多少个数/给出一个数组 求出ai + aj等于2的幂的数对个数】

    B. Powers of Two   You are given n integers a1, a2, ..., an. Find the number of pairs of indexes i,  ...

  8. AJPFX:不用递归巧妙求出1000的阶乘所有零和尾部零的个数

    package com.jonkey.test; import java.math.BigInteger; public class Test6 { /*** @param args*  需求:求出1 ...

  9. C语言:找出一个大于给定整数m且紧随m的素数,-求出能整除x且不是偶数的数的个数,

    //函数fun功能:找出一个大于给定整数m且紧随m的素数,并作为函数值返回. #include <stdlib.h> #include <conio.h> #include & ...

随机推荐

  1. JAVASE02-Unit011: TCP通信(小程序)

    TCP通信(小程序) server端: package chat; import java.io.BufferedReader; import java.io.IOException; import ...

  2. 如何安装nginx第三方模块

    nginx文件非常小但是性能非常的高效,这方面完胜apache,nginx文件小的一个原因之一是nginx自带的功能相对较少,好在nginx允许第三方模块,第三方模块使得nginx越发的强大. 在安装 ...

  3. FPGA的新变化

    FPGA SoC通过融合FPGA和ASIC两者的元件,跨越了灵活性和性能之间的界限.但随着它们进入高安全性.任务关键型市场,它们也面临着与标准SoC相同的问题,包括在日益复杂的器件中快速传输越来越多的 ...

  4. znpc改版前后网址修改办法

    znpc改版前后网址修改办法把原网址中的http://bbs.znpc.net/viewthread.php?替换为http://bbs.znpc.net/forum.php?mod=viewthre ...

  5. [转]Jsp 常用标签

    <jsp:include> 动态引入,涉及到的多个 jsp 页面会翻译成多个 servlet 并在执行时合并. include 指令 是静态引入,涉及到的多个 jsp 页面会翻译成一个 s ...

  6. 线程的run( ) 和 start( ) 区别

    Run() :  run()就是个普通方法,可以调用执行,但是是同步调用,没有异步的效果. Run()方法就是个普通方法,可以调用多次 Start():  通知线程规划期,此线程已经准备就绪,等待调用 ...

  7. verilog 之数字电路 寄存器,触发器。

    我一直听说没有由code到circuit就只是入门了.实在没办法了.我想了一招,一个一个的写,然后看RTL,然后分析.这是第一篇. 1.触发器. 没有复位,置位.posedge clk 是触发沿时钟. ...

  8. Python Issue: ValueError unknown locale: UTF-8 on OS X (Spyder)

    In your bash_profile you lack of something. add export LANG="en_US.UTF-8" export LC_COLLAT ...

  9. 使用java获取自己的机器网卡

    package org.ibase4j.core.util; import java.io.BufferedReader;import java.io.IOException;import java. ...

  10. 11_java之接口和多态

    01接口的概念 * A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来 ...