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;
}
posted @ 2017-08-10 09:09  pengwill  阅读(121)  评论(0编辑  收藏  举报