您的位置:首页 > 其它

poj 2992-Divisors

2011-05-06 19:58 274 查看
// poj 2992-Divisors
/*
* 数学题-因子个数
* 求:C(n,k)的因子的个数
* !!!直接计算会超时
* 需要打表d(n,m)保存所有n!相对于质因子m的约数的个数
* 知识:
* 1:整数n分解质因数 n=p1^a1*p2^a2*...*pm^am
* 2: n  的因子个数 num=(a1+1)*(a2+1)*...*(am+1)
* 3:n!相对质数p的因子个数 x=n/p+n/p^2+n/p^3+……
* 4: n!的素因子个数 = (n-1)!的素因子个数 + n的素因子个数
* tle tle ac 987k 532ms
*/
#include <iostream>
using namespace std;
#define MAX 444
int p[MAX],prime[MAX],d[MAX][MAX];
int k;
void creat()
{
int i,j;
for(prime[2] = 1,i = 3; i < MAX; ++ i)
prime[i] = 1;
for(i = 2; i < MAX/2; ++ i)
if(prime[i]){
for(j = i*i; j < MAX; j += i)
prime[j] = 0;
}
for(i = 2; i != MAX; ++ i)
if(prime[i])
p[k++] = i;
}
void make_sum()
{
int i,j;
for(i = 2; i <= 432; ++ i)
for(j = 0; j != k; ++ j){
if(i >= j && !(i%p[j])){
int i1 = i;
while(!(i1%p[j])){
d[i][p[j]] += 1;
i1 /= p[j];
}
}
d[i][p[j]] += d[i-1][p[j]];
}
}
int main(void)
{
int i,a,b;
creat(); make_sum();
while(scanf("%d%d",&a,&b)!=EOF){
long long sum = 1;
for(i = 0; i != k && a >= p[i]; ++ i)
sum *= (d[a][p[i]]-d[b][p[i]]-d[a-b][p[i]]+1);
cout<<sum<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: