poj 2992 素数

题意:求C(a, b) 的约数个数。(a b<432)

分析:C(a, b) = a! / b! / (a-b)!

对于任意质数 p, n! 中有(n/p + n/p^2 + n/p^3 + ...)个质因子p。

对于任意数 num = p1^a1 * p2^a2 *... pn^an ,其约数个数为(a1+1)*(a2+1)...(an+1)。

 

 

int prime[100]={2,3,5,7...421,431,1000000};

/*int s[1000005]={0};

inline int cal(int n,int k){
    int cnt=n/k;
    int sum=s[cnt];
    while(sum>=k){
        cnt++;
        sum/=k;
    }
    return cnt;
}*/

long long c[433][433];

long long cal(int n,int k){//n!里因子k的次数
    if(c[n][k]!=-1)return c[n][k];
    int i = n;
    long long res = 0;
    while(i) {
        i/=k;
        res += i;
    }
    c[n][k] = res;
    return c[n][k];
}

int main(){
    memset(c,-1,sizeof c);
    //FOR(i,1,1000005) s[i]=s[i-1]+i;
    int a,b;
    while(~scanf("%d%d",&a,&b)){
        long long ans=1;
        FOR(i,0,83){
            int p=prime[i];
            if(a<p)break;
            int c=cal(a,p)-cal(b,p)-cal(a-b,p);
            //if(c==0)continue;
            ans*=c+1;
        }
        printf("%I64d\n",ans);
    }
    return 0;
}

 

posted @ 2013-05-29 22:49  心向往之  阅读(157)  评论(0编辑  收藏  举报