poj 2992 Divisors

/* 
题意: 求 组合数 C(n,m)= n! / ( (n - m)! * m! ) 的 因数 个数,n<=431

设 n 的标准质因数分解式为 n = p1^a1 * p2^a2 *...* pk^ak , p1,p2..pk是素数
则 n 的 因数 个数 = (a1+1) * (a2+1) *...* (ak+1)
对于任意素数 p ,n!中有( n / p + n / p^2 + n / p^3 +...)个质因子 p
思路: 先打素数表,再对每个素数p求在C(n,m)的个数a,相乘即得结果

*/


#include <iostream> // 求 组合数 C(n,m)= n! / ( (n - m)! * m! ) 的 因数 个数
using namespace std;

const int maxn=431;
bool isPrime[maxn+1];
int prime[100],cnt; //cnt记录小于maxn的素数的数量

//线性筛法寻找素数
void makePrime()

{
memset(isPrime,true,sizeof(isPrime));
cnt=0;
for(int i=2;i<=maxn;i++)
{
if(isPrime[i])
prime[++cnt]=i;
for(int j=1; j<=cnt && i*prime[j]<=maxn; j++)
{
isPrime[i*prime[j]]=false;
if(i%prime[j]==0)
break;
}
}
}
int f(int n,int p) //计算n!里包含多少个质因子p
{

if(n<p)
return 0;
else
return n/p+f(n/p,p);
}
int main()
{
int n,m;
makePrime();
while(cin>>n>>m)
{
__int64 ans=1;
for(int i=1;i<=cnt;++i)
{
if(prime[i]>n)
break;
int t=f(n,prime[i])-f(n-m,prime[i])-f(m,prime[i]);
ans*=(t+1);
}
printf("%I64d\n",ans);
}
return 0;
}

posted on 2012-03-18 14:50  sysu_mjc  阅读(199)  评论(0编辑  收藏  举报

导航