#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的總個數。