利用勒让德定理求n!因数个数,组合数公式C(n,k) =n! /((n-k)!*k!)

首先打素数表。 

 

代码
#include <iostream>
#include 
<cstring>
#include 
<cstdio>
using namespace std;
const int N = 431+10;
bool isp[N];
int  p[N];
int pcnt;
void init()
{
    memset(isp,
true,sizeof(isp));
    pcnt 
= 0;
    
for(int i=2;i<N;i++)
    {
        
if(isp[i])
        {
            p[pcnt
++= i;
            
for(int j=i+i;j<N;j+=i)
            {
                isp[j] 
= false;
            }
        }
    }
}
int divisor(int n,int p)
{
    
int  ans = 0;
    
while(n>=p)
    {
        ans 
+= n/p;
        n 
/= p;
    }
    
return ans;
}
int main()
{
    init();
    
int k,n;
    
while(scanf("%d%d",&n,&k)!=EOF)
    {
        
int t;
        
long long ans=1;
        
for(int i=0;i<pcnt;i++)
        {
            t 
= divisor(n,p[i]) - divisor(n-k,p[i]) - divisor(k,p[i]);
            ans 
*= (t+1);
        }
        printf(
"%lld\n",ans);
    }
    
return 0;
}