POJ-2992 Divisors
题意:给定n和k,求C(n,k)的所有因子个数。 (0 ≤ k ≤ n ≤ 431)
思路:显然不能直接求,将C(n,k)化为n!/(k!*(n-k)!),先对431以内进行素数筛选,因为n!的因子个数等于(n-1)!的因子个数加n的因子个数,所以先打表求出阶乘的因子个数,然后就直接求了。
题目链接:http://poj.org/problem?id=2992
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring> 5 #include <string> 6 #include <algorithm> 7 #include <iostream> 8 using namespace std; 9 const int N=500; 10 11 bool isprime[N]; 12 int prime[N],factor[N][N]; 13 int n,k,cnt; 14 15 void getprime(){ 16 memset(isprime,false,sizeof(isprime)); 17 cnt=0; 18 for(int i=2;i<N;i++) 19 if(!isprime[i]){ 20 prime[++cnt]=i; 21 for(int j=2;i*j<N;j++) 22 isprime[i*j]=true; 23 } 24 } 25 26 void getfactor(){ 27 memset(factor,0,sizeof(factor)); 28 for(int i=1;i<N;i++){ 29 for(int j=0;j<=i;j++) 30 factor[i][j]=factor[i-1][j]; 31 int t=i; 32 for(int j=1;j<=cnt&&t>1;j++){ 33 while(t%prime[j]==0){ 34 factor[i][prime[j]]++; 35 t/=prime[j]; 36 } 37 } 38 } 39 } 40 41 int main(){ 42 43 // freopen("data.in","r",stdin); 44 // freopen("data.out","w",stdout); 45 46 getprime(); 47 getfactor(); 48 while(scanf("%d%d",&n,&k)!=EOF){ 49 long long ans=1; 50 for(int i=1;prime[i]<=n;i++) 51 ans*=(factor[n][prime[i]]-factor[k][prime[i]]-factor[n-k][prime[i]]+1); 52 printf("%lld\n",ans); 53 } 54 return 0; 55 }