poj 2992 Divisors(求组合数的因子个数)
2014-04-27 19:36
501 查看
http://poj.org/problem?id=2992
该题用到的定理:
.任意一个数n可以写成若干个素数的乘积,即 p1^a1 * p2^a2*......*pn^an,它的的约数的个数为 (a1+1)*(a2+1)*......(an+1).
.对于任意一个素数p, n!中含有p的个数为 (n/p + n/p^2 + n/p^3 + ......).
.c(n,k) = n! / ( k! * (n-k)! ).
该题用到的定理:
.任意一个数n可以写成若干个素数的乘积,即 p1^a1 * p2^a2*......*pn^an,它的的约数的个数为 (a1+1)*(a2+1)*......(an+1).
.对于任意一个素数p, n!中含有p的个数为 (n/p + n/p^2 + n/p^3 + ......).
.c(n,k) = n! / ( k! * (n-k)! ).
#include <stdio.h> #include <algorithm> #include <set> #include <map> #include <vector> #include <math.h> #include <string.h> #define LL long long #define _LL __int64 const int N = 500; int prime ; int prime_num; bool vis ; void Prime() { prime_num = 0; memset(vis,true,sizeof(vis)); for(int i = 2; i < 500; i++) { if(vis[i]) { for(int j = i*2; j < 500; j += i) vis[j] = false; } } for(int i = 2; i <= 431; i++) if(vis[i]) prime[ prime_num++ ] = i; } //n!中含有素数p的个数 int cal(int n, int p) { int ans = 0; int tmp = p; while(p <= n) { ans += n/p; p = p*tmp; } return ans; } int main() { int n,k; Prime(); while(~scanf("%d %d",&n,&k)) { LL ans = 1; for(int i = 0; i < prime_num; i++) { int a = cal(n,prime[i]); int b = cal(k,prime[i]); int c = cal(n-k,prime[i]); ans *= (a-b-c+1); } printf("%lld\n",ans); } 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 求组合数的约数个数
- poj 2992 Divisors(求因子个数)
- POJ 2992 Divisors (因子个数)
- POJ 2992 Divisors (求因子个数)
- Poj2992Divisors 组合数求因子的个数
- POJ 2992 求组合数的因子个数
- poj 2992 Divisors n!的因子个数的计算
- Divisors POJ - 2992