1. 程式人生 > >階乘質因數分解

階乘質因數分解

24
15
83333329
  1. #include<stdio.h>
  2. int main()  
  3. {  
  4.     int t;  
  5.     scanf("%d",&t);  
  6.     while(t--)  
  7.     {  
  8.         int m,n;  
  9.         scanf("%d%d",&m,&n);  
  10.         long int sum=0;  
  11.         while(1)  
  12.         {  
  13.             sum+=m/n;  
  14.             m=m/n;  
  15.             if(m==0)  
  16.                 break;  
  17.         }  
  18.         printf("%d\n",sum);  
  19.     }  
  20. }  
思路:

給定兩個數m,n

求m!分解質因數後因子n的個數。

這道題涉及到了大數問題,如果相乘直接求的話會超出資料型別的範圍。

下面給出一種效率比較高的演算法,我們一步一步來。

m!=1*2*3*……*(m-2)*(m-1)*m

可以表示成所有和n倍數有關的乘積再乘以其他和n沒有關係的

    =(n*2n*3n*......*kn)*ohter     other是不含n因子的數的乘積   因為 kn<=m 而k肯定是最大值  所以k=m/n

    =n^k*(1*2*......*k)*other  

    =n^k*k!*other     

從這個表示式中可以提取出k個n,然後按照相同的方法迴圈下去可以求出k!中因子n的個數。

每次求出n的個數的和就是m!中因子n的總個數。