UVA.10375 Choose and divide (唯一分解定理)
UVA.10375 Choose and divide (唯一分解定理)
题意分析
首先写出组合数的公式,然后利用唯一分解定理分解每一项,若是在分子,则加一,在分母减一,最后根据分解的结果计算即可。
代码总览
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#define nmax 10005
using namespace std;
int e[nmax];
bool isprime[nmax];
vector<int> v;
void prime(){
memset(isprime,1,sizeof isprime);
v.clear();
for(int i = 2;i<nmax;++i){
if(isprime[i]){
v.push_back(i);
for(int j = 2;i*j<nmax;++j)
isprime[i*j] = false;
}
}
}
void add_to_e(int num,int index){
for(int i = 2;i<=num;++i){
int tmp = i;
for(int j = 0;j<v.size();++j){
while(tmp % v[j] == 0){
e[v[j]]+=index;
tmp/= v[j];
}
if(tmp == 1) break;
}
}
}
int p,q,r,s;
int main()
{
prime();
while(scanf("%d %d %d %d",&p,&q,&r,&s) != EOF){
memset(e,0,sizeof e);
add_to_e(p,1);
add_to_e(s,1);
add_to_e(r-s,1);
add_to_e(r,-1);
add_to_e(q,-1);
add_to_e(p-q,-1);
double ans = 1;
for(int i = 2;i<nmax;++i){
if(e[i] !=0 ){
ans *= pow(i,e[i]);
}
}
printf("%.5f\n",ans);
}
return 0;
}