UVA 10375 Choose and divide【唯一分解定理】

题意:求C(p,q)/C(r,s),4个数均小于10000,答案不大于10^8

思路:根据答案的范围猜测,不需要使用高精度。根据唯一分解定理,每一个数都可以分解成若干素数相乘。先求出10000以内的所有素数,用a数组表示唯一分解式中个素数的指数,求出每个分子部分的素因子,并且相应的素数的指数加一。分母则减一。最后求解唯一分解式的值。

#include<stdio.h>
#include<string.h>
#include<math.h>
const int N=1e4+11;
int pr[N],p[N],a[N],cnt;
void init(){
    for(int i=2;i<N;i++){
        if(!p[i])    pr[++cnt]=i;
        for(int j=1;j<=cnt&&i*pr[j]<N;i++){
            p[pr[j]*i]=1;
            if(i%pr[j]==0)    break;
        }
    }
}
void er(int n,int d){
    for(int i=1;i<=cnt;i++){
        if(n%pr[i]==0){
            while(n%pr[i]==0){
                a[i]+=d;
                n/=pr[i];
            }
        }
        if(n==1)    break;
    }    
}
void add(int n,int d){
    for(int i=1;i<=n;i++){
        er(i,d);
    }
} 
int main(){
    init();
    int p,q,r,s;
    while(~scanf("%d%d%d%d",&p,&q,&r,&s)){
        memset(a,0,sizeof(a));
        add(p,1);add(q,-1);add(p-q,-1);
        add(r,-1);add(s,1);add(r-s,1);
        double ans=1.0;
        for(int i=1;i<=cnt;i++)
            ans*=pow(pr[i],a[i]);
        printf("%.5f
",ans);
    }
    return 0;
} 
原文地址:https://www.cnblogs.com/L-King/p/5758001.html