階層因式分解

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章