zoukankan      html  css  js  c++  java
  • 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;
    } 
  • 相关阅读:
    Sqlite EF6注册
    C# 等值锁定
    net 4.0+EF6+Sqlite 使用,安装,打包
    C#调用C++函数
    C# 调用.exe文件
    Java继承
    python多线程与threading模块
    Java对象构造
    python多线程与_thread模块
    Linux文件压缩与打包
  • 原文地址:https://www.cnblogs.com/L-King/p/5758001.html
Copyright © 2011-2022 走看看