zoukankan      html  css  js  c++  java
  • 快速求出n!质因数的个数

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

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

     1 inline void calc(int x)
     2 {
     3     int xx=x;
     4     for(int i=2;i*i<=xx;i++)
     5     {
     6         while(x%i==0)//不断进行除法,找出多少的当前的质数
     7         {
     8             c[i]++;x/=i;
     9         }
    10         if(x==1)break;
    11     }
    12     if(x>1)c[x]++;//如果剩下的数也是个质数,那么这个质数也要加
    13 }

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

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

    然后进行如下操作:

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

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

    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.结束

    非常快。

  • 相关阅读:
    【WPF】 Prism 框架中,TabControl 作为Region时如何设置Header
    【WPF】将控件事件中的参数,传递到ViewModel中
    WPF 一种带有多个子集的类ComBox 解决方法
    WPF TabControl美化
    【WPF】 问题总结-RaidButton修改样式模板后作用区域的变化
    C# 打开Excel文件
    获取文件夹下所有的文件名
    访问需要HTTP Basic Authentication认证的资源的c#的实现 将账号密码放入url
    第十三章 建造者模式(Builder)
    第十二章 外观模式 (Facade)
  • 原文地址:https://www.cnblogs.com/tldr/p/11615239.html
Copyright © 2011-2022 走看看