UVA-10375 唯一分解定理

#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<stdio.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)

using namespace std;
const int N = 10007;
bool is_prime[N];
int prime[N];
int cnt=0;
void get_prime(){
  int m=sqrt(N);
  memset(is_prime,0,sizeof(is_prime));
  rep(i,2,m){
     if (!is_prime[i]){
       for (int j=i*i;j<=N;j+=i){
         is_prime[j]=1;
       }
     }
  }
  rep(i,2,N){
    if (is_prime[i]==0){
        prime[cnt++]=i;
    }
  }
}
int e[N];
void add_integer(int num,int d){
  for (int i=0;i<cnt;i++){
     while(num%prime[i]==0){
        num/=prime[i];
        e[i]+=d;
     }
     if (num==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;
  get_prime();
  while(~scanf("%d%d%d%d",&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);
        int maxx = max(r,p);
        double ans=1;
        for (int i=0;i<=maxx;i++){
            ans*=pow(prime[i],e[i]);
        }
        printf("%.5f\n",ans);
  }
  return 0;
}

 

posted @ 2018-10-19 22:58  bluefly-hrbust  阅读(151)  评论(0编辑  收藏  举报