POJ 2992 Divisors 求组合数的约数个数
来源:互联网 发布:北京宇信科技集团 知乎 编辑:程序博客网 时间:2024/04/30 12:12
点击打开链接
Divisors
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 9856 Accepted: 2896
Description
Your task in this problem is to determine the number of divisors of Cnk. Just for fun -- or do you need any special reason for such a useful computation?
Input
The input consists of several instances. Each instance consists of a single line containing two integers n and k (0 ≤ k ≤ n ≤ 431), separated by a single space.
Output
For each instance, output a line containing exactly one integer -- the number of distinct divisors of Cnk. For the input instances, this number does not exceed 263 - 1.
Sample Input
5 16 310 4
Sample Output
2616
Source
CTU Open 2005
求C(n,k)的约数的个数。
n和k都很大,直接求肯定不行。假设将一个数表示成它的质因数分解,如A=a^p1*b^p2*c^p3*...*n^pn.
那么它的约数个数就是:ans=(p1+1)*(p2+1)*(p3+1)*...*(pn+1).而C(n,k)=n!/[(k!*(n-k)!],c[n][k]代表n的阶乘时能够分解出几个k。那么只需要求出他们的阶乘对于每一个素数的个数就可以了。公式:ai=c[n][prime[i]]-c[k][prime[i]]-c[(n-k)][prime[i]]。ans=a1*a2.*...*ak (k代表当prime[k]小于n的时候)。
//3624K610MS#include<stdio.h>#include<string.h>#define N 100007bool visit[1010];long long c[1500][1500];long long prime[107];void init_prim()//prime存的是下标,visit存的是数。visit[5]==true。{ long long num=0; memset(visit,true,sizeof(visit)); for(long long i=2;i<1007;++i) { if(visit[i]==true) { num++; prime[num]=i; } for(long long j=1;((j<=num)&&(i*prime[j]<=10007));++j) { visit[i*prime[j]]=false; if(i%prime[j]==0) break; } }}void init(){ for(long long i=2;i<=437;i++) for(long long j=1;prime[j]<=i;j++) { long long n=i,res=0; while(n){n/=prime[j];res+=n;} c[i][prime[j]]=res; }}int main(){ long long n,k; init_prim(); init(); while(scanf("%I64d%I64d",&n,&k)!=EOF) { long long ans=1,a; for(long long i=1;prime[i]<=n;i++) { a=c[n][prime[i]]-c[k][prime[i]]-c[n-k][prime[i]]; ans*=(1+a); } printf("%I64d\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-2292(求约数个数)(Divisors)
- Codeforces 27E Number With The Given Amount Of Divisors (求约数个数为n的最小数)
- poj 2992 Divisors(求因子个数)
- 求一个数的约数个数!
- 求一个数约数的个数
- POJ 2886 Who Gets the MostCandies?(线段树+模拟+求数的约数个数)
- 求约数的个数
- 求约数的个数
- 求约数的个数
- ZOJ 2562 More Divisors (n以内约数个数最多的最小数)
- STL源码分析----神奇的 list 的 sort 算法实现
- android textview设置居中循环显示,
- AJAX - 服务器响应
- hudson 问题解决:修改同时跑的job 的数量和 设置Maven 运行的内存等
- 详解流编辑器 sed 和 编程语言 awk
- POJ 2992 Divisors 求组合数的约数个数
- Drawable资源---主题资源
- windows技巧--win7修改锁屏壁纸(不用软件)
- 饭卡
- poj 2524 Ubiquitous Religions
- 微信公共服务平台开发(.Net 的实现)1-------认证“成为开发者”
- IOS 运行时、ISA、动态、runtime。。。
- 网络嗅探器(Sniffer)的原理与实现(1)
- One fihgt one hdu 2813 map+二分图最优匹配+KM快速模板