UVA10375 Choose and divide 组合数
2013-12-26 23:31
148 查看
题意很简单,求两个组合数相除,数字有点大,想要直接求是不可能的,只能想办法化简或者其它办法,基础可能打的不是很结实,一开始想不出,有点想要把除法变成乘法,然后约分,这样不太现实,万一p,q很大,r,s很小还是有可能超的,感觉这道题目比较好的,思路有点活,最后想出来还是觉得题目比较奇妙的,题目给的
m!
C(m,n) = -------------
n!(m-n)!
事实上在看白书的时候里面数学基础知识那里有个介绍的,还可以写成
m*(m-1)*(m-2)...(m-n+1)
C(m,n) = ------------------------------------
n!
然后进一步我们可以发现,观察一下,分母阶乘化简开来,项数为n项,分子我们仔细看看,从m乘到(m-n+1),实际上项数(m-(m-n))也就是n项,意思是这个分式的分子项数 和分母项数是一样的,那么就可以利用一乘一除的方法来进行求解了,
#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>
#define ll long long
#define eps 1e-8
#define inf 0xfffffff
const ll INF = 1ll<<61;
using namespace std;
//vector<pair<int,int> > G;
//typedef pair<int,int > P;
//vector<pair<int,int> > ::iterator iter;
//
//map<ll,int >mp;
//map<ll,int >::iterator p;
//
int main()
{
int p,q,r,s;
while(scanf("%d %d %d %d",&p,&q,&r,&s)==4)
{
int max1=max(p-q,q);
int max2=max(r-s,s);
int maxn=max(max1,max2);
double ans=1.00000;
for(int i=1;i<=maxn;i++)
{
if(i<=max1)
ans=ans/i*(p-max1+i);
if(i<=max2)
ans=ans/(r-max2+i)*i;
}
printf("%.5lf\n",ans);
}
return EXIT_SUCCESS;
}
m!
C(m,n) = -------------
n!(m-n)!
事实上在看白书的时候里面数学基础知识那里有个介绍的,还可以写成
m*(m-1)*(m-2)...(m-n+1)
C(m,n) = ------------------------------------
n!
然后进一步我们可以发现,观察一下,分母阶乘化简开来,项数为n项,分子我们仔细看看,从m乘到(m-n+1),实际上项数(m-(m-n))也就是n项,意思是这个分式的分子项数 和分母项数是一样的,那么就可以利用一乘一除的方法来进行求解了,
#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>
#define ll long long
#define eps 1e-8
#define inf 0xfffffff
const ll INF = 1ll<<61;
using namespace std;
//vector<pair<int,int> > G;
//typedef pair<int,int > P;
//vector<pair<int,int> > ::iterator iter;
//
//map<ll,int >mp;
//map<ll,int >::iterator p;
//
int main()
{
int p,q,r,s;
while(scanf("%d %d %d %d",&p,&q,&r,&s)==4)
{
int max1=max(p-q,q);
int max2=max(r-s,s);
int maxn=max(max1,max2);
double ans=1.00000;
for(int i=1;i<=maxn;i++)
{
if(i<=max1)
ans=ans/i*(p-max1+i);
if(i<=max2)
ans=ans/(r-max2+i)*i;
}
printf("%.5lf\n",ans);
}
return EXIT_SUCCESS;
}
相关文章推荐
- 【数论】Choose and Divide, UVa10375 【组合数学】【唯一分解定理】【精度】
- UVa10375 Choose and divide
- UVA 10375 - Choose and divide(数论)(组合数学)
- UVA10375 Choose and divide 质因数分解
- 例题10-3 选择与除法(Choose and Divide,UVa10375)
- uva10375 - Choose and divide(选择与除法)
- uva10375 Choose and divide
- uva10375 Choose and divide 筛素数,唯一分解原理
- uva10375 Choose and Divide(唯一分解定理)
- UVA 10375 Choose and divide 计算组合数C(p,q)/C(r,s)。
- uva10375(唯一分解定理) Choose and divide
- 51nod oj 1305 Pairwise Sum and Divide 【思维-组合-二分查找】
- Choose and divide UVA - 10375
- UVA 10375 Choose and divide(大数的表示)
- Choose and divide UVA - 10375
- uva 10375 Choose and divide
- Uva 10375 Choose and divide 素数唯一分解定理
- UVA - 10375 Choose and divide
- 10375 - Choose and divide
- UVA 10375 Choose and divide