关于n! 的一个问题
求 n1中有多少个质因子p.
n!中有(n/p+n/p2 +n/p3 +…)
//计算n!中有多少个质因子p
int cal (int n,int p)
{
int ans=0;
while(n){
ans+=n/p;
n/=p;
}
return ans;
}
如果想要计算n!的末尾有多少个零:由于0的个数等于n!中因子10的个数,而这又等于n!中质因子5的个数,因此只需要带入cal(n,5)就可以得到结果。
方法2: n! 中质因子的p的个数,实际上等于1~n中p的倍数的个数n/p加上(n/p)!中质因子p的个数。
int cal (int n,int p)
{
if(n<p) return 0;
return n/p+cal(n/p,p);
}
组合数的计算
方法1:通过定义式直接计算
方法2:通过递推公式计算
Cm n =Cm n-1 +Cm-1 n-1
long long C(long long n,int long long m)
{
if(m==0||m==n) return 1;
return C(n-1,m)+C(n-1,m-1);
}
记录下已经计算过的C(n,m),简化运算
long long res[67][67]={0};
long long C(long long n, long long m)
{
if(n==0||m==n) return 1;
if(res[n][m]!=0) return res[n][m];
return res[n][m]=C(n-1,m)+C(n-1,m);
}
方法三:通过定义式的变形来计算
long long C(long long n,long long m){
long long ans=1;
for(long long i=1;i<=m;i++){
ans=ans*(n-m+i)/i;
}
return ans;
}