1. 程式人生 > >【數論】Choose and Divide, UVa10375 【組合數學】【唯一分解定理】【精度】

【數論】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;
}