南阳理工:阶乘因式分解(二)

阶乘因式分解(二)

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 3
描述

给定两个数n,m,其中m是一个素数。

将n(0<=n<=2^31)的阶乘分解质因数,求其中有多少个m。

注:^为求幂符号。

 

输入
第一行是一个整数s(0<s<=100),表示测试数据的组数
随后的s行, 每行有两个整数n,m。
输出
输出m的个数
样例输入
3  100 5  16 2  1000000000  13
样例输出
24  15  83333329
 
/*
可以想象,n的阶乘从1开始到n,阶乘因式分解第一个可以出现m的是m那一项,接着必定是2m那一项,接着是3m、4m..pm..km<=n,(k+1)m>n.
则首先可以判断里面出现了k个质因子m, 但是中间的一项pm中p可能等于m,也可能等于m*m,m*m*m等,所以n/m同时也表示最后一个含有质因子m且
小于n的最大的阶乘因子,也就是上面的k,所以k/m得到的就是k里面还有多少个m,然后再除以m,一次类推,则可以把上面每一项pm里面p的
m质因子给求出来,每一次求过之后都加到一块则是n!中的m因子个数。
*/
#include<stdio.h>
int main()
{
   int N,n,m;
   scanf("%d",&N);
   while (N--)
   {
      scanf("%d%d",&n,&m);
      int ans;
      ans=0;
      while(n>=m)
      {
         ans+=n/m;
         n/=m;
      }
      printf("%d\n",ans);
   }
   return 0;
}
/*下面这个也能求出来结果,但是会超时*/
#include<stdio.h>
int main()
{
 int N,m,n,sum,i,k;
 scanf("%d",&N);
 while(N--)
 {
       scanf("%d %d",&n,&m);
      for(i=1,sum=0;i<=n;i++)
      {
             k=i;
             while(k%m==0)
             {
                   
                 k=k/m;
                 sum++;
             }
      }   
      printf("%d\n",sum);
 }
 system("pause");
 return 0;
}

你可能感兴趣的:(南阳理工:阶乘因式分解(二))