您的位置:首页 > 其它

pku 2992 因子和因子个数的应用

2014-07-27 10:14 169 查看
题意是要求C(n, k)约数的个数:

如果数据不大,我们可以用杨辉三角递推出来组合数,然后再求约数的个数。

但是这道题数据比较大,需要处理一下:

(1)首先先筛选出440以内的素数

(2)然后处理阶乘 将阶乘素因子分解

因为如果一个整数能素因子分解为如下形式: S=(p1^a1)*(p2^a2)*(p3^a3)*(p4^a4)....... (1)式

那么其因子个数为:(a1+1)*(a2+1)*(a3+1)*(a4+1)*...........

C(n,k)= n!/k!(n-k)!

把分子和分母都转化为(1)式即可求出

下面给出我的代码

#include <iostream>

#include <stdio.h>

#include <cmath>

using namespace std;

int n,k,num=0;

int prime[440];

bool isprime[440];

void doprime() //线性筛选出440以内的素数

{

memset(isprime,true,sizeof(isprime));

isprime[0]=isprime[1]=0;

for(int i=2;i<440;i++)

{

if(isprime[i])

{

prime[num++]=i;

for(int j=i+i;j<440;j+=i)

isprime[j]=0;

}

}

}

int main()

{

doprime();

long long jie[440][440]; //处理阶乘 jie[i][j] 表示i的阶乘表示成素因子时 prime[j]的指数

memset(jie,0,sizeof(jie));

for(int i=0;i<num;i++)

for(int j=2;j<440;j++)

jie[j][i]=j/prime[i]+jie[j/prime[i]][i];

long long cnt[440][440];

for(int i=2;i<440;i++)

for(int j=1;j<i;j++)

{

cnt[i][j]=1;

for(int k=0;k<num&&jie[i][k];k++)

{

int side=jie[i][k]-jie[j][k]-jie[i-j][k];

if(side)

cnt[i][j]*=(side+1);

}

}

while(cin>>n>>k)

{

if(k==0||k==n)

printf("1\n");

else

printf("%lld\n",cnt
[k]);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: