給定兩個(gè)數(shù)m,n求m!分解質(zhì)因數(shù)后因子n的個(gè)數(shù)。
這道題涉及到了大數(shù)問(wèn)題,如果相乘直接求的話會(huì)超出數(shù)據(jù)類(lèi)型的范圍。
下面給出一種效率比較高的算法,我們一步一步來(lái)。
m!=1*2*3*……*(m-2)*(m-1)*m
可以表示成所有和n倍數(shù)有關(guān)的乘積再乘以其他和n沒(méi)有關(guān)系的
=(n*2n*3n*......*kn)*ohter other是不含n因子的數(shù)的乘積 因?yàn)?kn<=m 而k肯定是最大值 所以k=m/n
=n^k*(1*2*......*k)*other
=n^k*k!*other
從這個(gè)表達(dá)式中可以提取出k個(gè)n,然后按照相同的方法循環(huán)下去可以求出k!中因子n的個(gè)數(shù)。
每次求出n的個(gè)數(shù)的和就是m!中因子n的總個(gè)數(shù)。
#include<iostream>
using namespace std;
int get(int n,int m)
{
int sum=0,k;
while(n)
{
k=n/m;
sum+=k;
n=k;
}
return sum;
}
int main()
{
int n;
cin>>n;
while(n--)
{
int a,b;
cin>>a>>b;
cout<<get(a,b)<<endl;
}
}