您的位置:首页 > 其它

POJ 2992 Divisors (因子个数)

2015-03-04 09:57 435 查看
题目:http://poj.org/problem?id=2992

题意:求C(n,k)的因子个数。n<=431

分析:将1!~431!的每个素因子的个数打表,而C(n,k)=n!/(k!*(n-k)!),再利用求因子个数的公式即可/article/2710032.html

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;
typedef long long LL;

vector <int > vt;
int a[440][440];

int prime[500],nprime;
bool isprime[500];

void doprime()
{
    nprime=0;
    LL i,j;
    for(i=1;i<500;i+=2)
        isprime[i]=true;
    isprime[1]=false;
    isprime[2]=true;
    for(i=2;i<500;i++)
    {
        if(isprime[i])
        {
            prime[nprime++]=i;
            for(j=i*i;j<500;j+=i)
                isprime[j]=false;
        }
    }
}

void divd(int x)
{
    vt.clear();
    int i,j,t=x;
    for(i=0;i<nprime && prime[i]*prime[i]<=x;i++)
    {
        while(t%prime[i]==0)
        {
            vt.push_back(prime[i]);
            t/=prime[i];
        }
        if(t==1)
            break;
    }
    if(t>1)
        vt.push_back(t);
}

void work()
{
    int i,j;
    for(i=2;i<=431;i++)
    {
        memcpy(a[i],a[i-1],sizeof(a[i]));
        divd(i);
        for(j=0;j<vt.size();j++)
            a[i][vt[j]]++;
    }
}

int main()
{
    doprime();
    work();
    int n,k,i,j;
    LL ans;
    int use[500];
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        memset(use,0,sizeof(use));
        for(i=2;i<=431;i++)
            use[i]+=a
[i]-a[k][i]-a[n-k][i];
        ans=1;
        for(i=2;i<=431;i++)
            ans*=(use[i]+1ll);
        printf("%lld\n",ans);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: