• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Hug_Sea
博客园    首页    新随笔    联系   管理    订阅  订阅

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

 

View Code
 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 }
posted @ 2012-08-14 09:33  Hug_Sea  阅读(140)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3