UVA.10375 Choose and divide (唯一分解定理)

来源:互联网 发布:医学统计学简易软件 编辑:程序博客网 时间:2024/05/23 01:18

UVA.10375 Choose and divide (唯一分解定理)

题意分析

首先写出组合数的公式,然后利用唯一分解定理分解每一项,若是在分子,则加一,在分母减一,最后根据分解的结果计算即可。

代码总览

#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <cmath>#define nmax 10005using 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;}
阅读全文
0 0
原创粉丝点击