poj 2992 Divisors 整数分解
2014-07-02 10:57
375 查看
设m=C(n,k)=n!/((n-k)!*k!) 问题:求m的因数的个数
将m分解质因数得到
p1有a1个
p2有a2个
....
由于每个质因数可以取0~ai个(全部取0就是1,全部取ai就是m)最后的答案就是(a1+1)*(a2+1)*....*
注意不能直接将m分解,因为太大,所以要先分解n,n-k,k,根据他们再来加减。
将m分解质因数得到
p1有a1个
p2有a2个
....
由于每个质因数可以取0~ai个(全部取0就是1,全部取ai就是m)最后的答案就是(a1+1)*(a2+1)*....*
注意不能直接将m分解,因为太大,所以要先分解n,n-k,k,根据他们再来加减。
#include <iostream> #include <cstdio> #include <cmath> #include<cstring> #include<cstdlib> #include<vector> using namespace std; //C(n,k)=n!/((n-k)!*k!) struct node { int x,num; node(int a,int b){x=a;num=b;} }; vector<node> pri[444]; void init() { for(int i=1;i<=435;i++) { int tn=i; for(int j=2;j*j<=tn;j++) { int cnt=0; if(tn%j==0) { while(tn%j==0) {tn/=j;cnt++;} pri[i].push_back(node(j,cnt)); } } if(tn>1) pri[i].push_back(node(tn,1)); } } int pnum[444]; long long cal(int n,int k) { int tk=n-k; memset(pnum,0,sizeof(pnum)); for(int i=n;i>=1;i--) for(int j=0;j<pri[i].size();j++) pnum[pri[i][j].x]+=pri[i][j].num; for(int i=tk;i>=1;i--) for(int j=0;j<pri[i].size();j++) pnum[pri[i][j].x]-=pri[i][j].num; for(int i=k;i>=1;i--) for(int j=0;j<pri[i].size();j++) pnum[pri[i][j].x]-=pri[i][j].num; long long ans=1; for(int i=1;i<=n;i++) { if(pnum[i]) ans*=(pnum[i]+1); } return ans; } int main() { init(); int n,k; while(~scanf("%d%d",&n,&k)) { printf("%lld\n",cal(n,k)); } return 0; }
相关文章推荐
- POJ2992 Divisors(整数分解)
- 组合数学+整数分解 POJ 2992 Divisors
- POJ 2992 Divisors ★ (n!分解素因子)
- POJ 2992 Divisors(欧拉素筛+组合数分解)
- POJ 2992 Divisors ★ (n!分解素因子)
- POJ 2992 Divisors(阶乘的素因子分解)
- POJ 2992 Divisors 求一个数的因数的个数
- POJ 2992 Divisors (快速求阶乘的素因子)
- Poj2992Divisors 组合数求因子的个数
- poj 2992 Divisors 简单数论
- POJ 1221 整数分解 DP
- POJ2992 Divisors
- poj 2992 Divisors
- poj 2992 Divisors
- POJ_2992_divisors
- POJ 2992 Divisors(求组合数因子个数)
- poj 2992 Divisors
- POJ 2992 Divisors(约数定理)
- POJ 2447 RSA(大整数分解质因数+逆元)
- poj 2992 Divisors