#include<iostream>
using namespace std;
int main()
{
int N;
cin>>N;
while(N--)
{
int num,divide,value;
cin>>num>>divide;
int result=0;
for(int i=num;i>0;i--)
{ value=i;
while(value%divide==0)
{ value=value/divide;
result++;
}
}
cout<<result<<endl;
}
}
提供新思路:
下面给出一种效率比较高的算法,我们一步一步来。
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的总个数。