【数论】Choose and Divide, UVa10375 【组合数学】【唯一分解定理】【精度】
唯一分解定理
#include<bits/stdc++.h>
using namespace std;
int p,q,r,s,prime[10005],cnt,e[10005];bool vis[10005];
void getprime(int n){
vis[0] = vis[1] = 1;
for(int i=2;i<=n;i++){
if(!vis[i])prime[++cnt]=i;
for(int j=1;j<=cnt&&prime[j]<=n/i;j++){
vis[i*prime[j]]=true;
if(i%prime[j]==0)break;
}
}
}
void addint(int n,int d){
for(int i=1;i<=cnt;i++){
while(n%prime[i]==0){
e[i]+=d;
n/=prime[i];
}
}
}
void add(int n,int d){//@结果乘以(n!)d
for(int i=1;i<=n;i++)addint(i,d);
}
int main(){
ios::sync_with_stdio(false);getprime(10000);
while(cin>>p>>q>>r>>s){
memset(e,0,sizeof(e));add(p,1);add(s,1);add(r-s,1);add(q,-1);add(p-q,-1);add(r,-1);
double ans = 1;for(int i=1;i<=cnt;i++)ans*=pow(prime[i],e[i]);
cout<<setiosflags(ios::fixed)<<setprecision(5)<<ans<<endl;
}
return 0;
}