poj 2992 Divisors(求组合数的因子个数)
来源:互联网 发布:花生壳linux版客户端 编辑:程序博客网 时间:2024/05/16 05:40
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)! ).
#include <stdio.h>#include <algorithm>#include <set>#include <map>#include <vector>#include <math.h>#include <string.h>#define LL long long#define _LL __int64const int N = 500;int prime[N];int prime_num;bool vis[N];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;}
0 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 n!的因子个数的计算
- POJ 2992 Divisors (快速求阶乘的素因子)
- codeforces 665F. Four Divisors(求n以内因子数是4的数的个数)
- uva 294 Divisors 求因子个数
- 求一个数的因子的个数
- HDU 2521 求数的因子个数
- 求一个数的因子个数
- v4l2的学习
- 分层开发思想
- UIImageView的for循环 之田字格与曲线行LayOut
- 软件开发过程与思想
- 五一九天假期ACM集训记录【4月27日—第二天】
- poj 2992 Divisors(求组合数的因子个数)
- 总结
- 1011.最大连续子序列
- HDU_1113Word Amalgamation
- Java 内部类基本用法
- OO开发思想:面向对象的开发方法(Object oriented,OO)
- 1257 hdu
- java书籍Top10另一说法
- Python核心编程第六章笔记