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; }
相关文章推荐
- poj 2992 Divisors
- POJ 2992 Divisors 求一个数的因数的个数
- POJ 2992 Divisors(欧拉素筛+组合数分解)
- POJ 2992 Divisors
- POJ 2992 Divisors
- POJ 2992 Divisors 解题报告(素因子统计)
- poj 2992 Divisors (素数打表+阶乘因子求解)
- poj 2992 Divisors 简单的数论问题
- POJ 2992 Divisors(求组合数因子个数)
- POJ 2992 Divisors[组合数 因子个数]
- poj 2992 Divisors——数论
- POJ 2992 Divisors 求组合数因子个数
- POJ 2992 Divisors ★ (n!分解素因子)
- POJ 2992 Divisors (求因子个数)
- poj - 2992 - Divisors
- 组合数学+整数分解 POJ 2992 Divisors
- 质因数计数公式 POJ 2992 Divisors
- POJ 2992 Divisors (快速求阶乘的素因子)
- POJ 2992 Divisors ★ (n!分解素因子)
- poj 2992 Divisors 筛法 算术基本定理