1. 程式人生 > >UVA - 10375(唯一分解定理)

UVA - 10375(唯一分解定理)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=1e4+10;
int prime[maxn],primey;
int e[maxn];

void csh()
{
    memset(prime,1,sizeof(prime));
    prime[0]=prime[1]=0;
    for
(int i=2;i<=sqrt(maxn+0.5);i++) { if(prime[i]) { for(int j=i*i;j<=maxn;j+=i) { prime[j]=0; } } } primey=0; for(int i=2;i<=maxn;i++) { if(prime[i]) { prime[primey++]=i; } } }
void add(int n,int d) { for(int i=0;i<primey;i++) { while(n%prime[i]==0) { n/=prime[i]; e[i]+=d; } if(n==1)break; } } void fac(int n,int d) { for(int i=1;i<=n;i++) { add(i,d); } } int main() { csh();
int p,q,r,s; while(scanf("%d %d %d %d",&p,&q,&r,&s)!=EOF) { memset(e,0,sizeof(e)); fac(p,1); fac(q,-1); fac(p-q,-1); fac(s,1); fac(r-s,1); fac(r,-1); int m=max(q,s); double ans=1; for(int i=0;i<=m;i++) { ans*=pow(prime[i],e[i]); } printf("%.5f\n",ans); } return 0; }