Posted on 2011-11-09 10:56
C小加 閱讀(1457)
評論(1) 編輯 收藏 引用
給定兩個數m,n求m!分解質因數后因子n的個數。
這道題涉及到了大數問題,如果相乘直接求的話會超出數據類型的范圍。
下面給出一種效率比較高的算法,我們一步一步來。
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的總個數。
#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;
}
}