POJ-2992 Divisors
2015-08-19 12:24
435 查看
题目:
http://poj.org/problem?id=2992题意:
给出组合数Cnk.的n与k,求该组合数的约数个数。思路:
分解质因子,找出组合数中每个质因子个数加一相乘就是约数个数,只是求约数个数的基本思想,回到这道题,组合数求解有Cnk=n! / (k!*(n-k)!).所以只要分别求出三个阶乘的质因子,之后分子的质因子减去分母的质因子就行了。
也就是要求n!的质因子,可以不断枚举然后递归找出它相对于所有素数的因子个数,n/pri[i]就是相对于pri[i]的因子个数,再递归n/pri[i]/pri[i]就是相对于pri[i]^2的因子个数,
以此类推找出左右因子个数相乘即可。
代码:
#define N 500 int n,m; bool mark ; int pri ,cnt; void SP() { cnt=0; memset(mark,true,sizeof(mark)); mark[0]=mark[1]=false; for(int i=2;i<N;i++) { if(mark[i]) pri[cnt++]=i; for (int j=0;(j<cnt)&&(i*pri[j]<N);j++) { mark[i*pri[j]]=false; if (i%pri[j]==0) break; } } } int dfs(int now,int num) { if(now<num) return 0; return now/num + dfs(now/num,num); } int main() { int i,j,k,kk,t,x,y,z; SP(); while(scanf("%d%d",&n,&k)!=EOF) { long long res=1; for(i=0;i<cnt&&pri[i]<=n;i++) res*=dfs(n,pri[i])-dfs(k,pri[i])-dfs(n-k,pri[i])+1; printf("%lld\n",res); } return 0; }
相关文章推荐
- Qt 技术积累
- Swift 2.0学习笔记(Day 2)——使用Web网站编写Swift代码
- How to change Polymer(1.0) paper-toolbar background colour?
- MySQL表达式计算
- Camera学习,调用系统摄像机上传图片。
- acm c++常用函数(stl)
- iOS开发系列之四 - UITextView 用法小结
- KMP算法的python实现
- 文档注释,建立解释文档
- IIS配置WCF服务
- Xcode-5.1.1更改文件盯作者
- datagrid: 排序没有效果
- HDU 2824 The Euler function(欧拉函数)
- spring 定时任务
- sizeof求结构体大小
- 使用C语言构建基本的二叉树数据结构
- 多线程编程学习总结
- Linux————TCP/IP协议
- iOS开发系列之三 - UITextField 用法小结
- 用Spring建立RESTful Web Service的Server和Client