POJ 2992 Divisors
每个数都可以分解成素数的乘积:
写成指数形式:n=p1^e1*p2^e2*...*pn^en;(p都是素数)
那么n的因数的数量m=(e1+1)*(e2+1)*...*(en+1);
所以用筛选法筛出1-n的各个素因数的数量;
然后容易得到n!的各个素因数的数量;
因为C(n,k)=n!/k!/(n-k)!;
所以接下来的事就容易办了.....
我的代码:
1 #include<cstdio> 2 using namespace std; 3 int e[432][432],sum[432][432],n,num,kk; 4 bool prim[432]; 5 long long ans; 6 int main() 7 { 8 for(int i=2; i<432; i++) 9 { 10 if(!prim[i]) 11 { 12 num++; 13 e[i][num]++; 14 for(int j=i<<1; j<432; j+=i) 15 { 16 prim[j]=1; 17 e[j][num]=e[j/i][num]+1; 18 } 19 } 20 } 21 for(int i=1; i<432; i++) 22 for(int k=1; k<=num; k++) 23 sum[i][k]=sum[i-1][k]+e[i][k]; 24 while(scanf("%d%d",&n,&kk)!=EOF) 25 { 26 ans=1; 27 for(int i=1; i<=num; i++) 28 ans=ans*(sum[n][i]-sum[kk][i]-sum[n-kk][i]+1); 29 30 printf("%lld\n",ans); 31 } 32 return 0; 33 }