UVA 10375 选择与除法

一看四个整数的范围,<=10000  所以我们肯定不能直接打表求阶乘

利用唯一分解定理(任何一个大于1的正整数都能够被唯一地分解成质因子乘积)

#include<iostream>
#include<string>
#include<string>
#include<string.h>
#include<stdio.h>
#include<queue>
#include<math.h>
#include<vector>
#include<stdlib.h>
#include<algorithm>
#define maxn 10010
using namespace std;
int primes[maxn],flag,t,e[maxn];
void add_integer(int n,int d){
    for(int i=0;i<t;i++){
        while(n%primes[i]==0){
            n/=primes[i];
            e[i]+=d;
        }
         if(n==1) break;
    }
}
void add_factorial(int n,int d){
    for(int i=1;i<=n;i++){
        add_integer(i,d);
    }
}
int main(){
  int p,q,r,s;
  memset(primes,0,sizeof(primes));
  t=1;
  primes[0]=2;
    for(int i=3;i<=maxn;i++){
         flag=1;
        for(int k=2;k<=sqrt(i);k++){
                if(i%k==0){
                    flag=0;
                    break;
                }
            }
            if(flag){primes[t++]=i;}
        }
  while(cin>>p>>q>>r>>s){
        memset(e,0,sizeof(e));
     add_factorial(p,1);
     add_factorial(q,-1);
     add_factorial(p-q,-1);
     add_factorial(r,-1);
     add_factorial(s,1);
     add_factorial(r-s,1);
     double ans=1;
     for(int i=0;i<t;i++){
           // cout<<primes[i]<<" "<<e[i]<<endl;
        ans*=pow(primes[i],e[i]);
     }
     printf("%.5lf\n",ans);

  }

   return 0;
}

 

posted @ 2016-03-09 20:33  咸咸的告别  阅读(328)  评论(0编辑  收藏  举报