Choose and divide uva 10375

发布时间 2023-04-06 21:23:20作者: towboat

求C(i,j)/ C(u,v)

公式化简

 

筛出所有质数

除法的时候: 因数分解, 求对每个质数的个数的贡献

  #include <iostream>
  #include <cstring>
  #include <cmath>
  #include <iomanip>
  #include <vector>
  using namespace std;
   const int M =1e4+3;
 int vis[M],p,q,s,r;
 vector<int> prm;
 int A[M];
 
 void init(int top){
 	int i,j;
 	for(i=2;i<=top;i++)
 	 if(vis[i]==0){
 	 	prm.push_back(i);
 	  	for(j=i*2;j<=top;j+=i) vis[j]=1;
 	 } 
 }
 
 void ADD(int x,int v){
 	for(int i=0;i<prm.size();i++){
 		while(x%prm[i]==0){
 			A[i]+=v;
 			x/=prm[i];
 		}
 		if(x==1) break;
 	}
 }
 void help(int x,int v){
 	for(int i=1;i<=x;i++) ADD(i,v);
 }
 void solve(){
 	help(p,1),help(r-s,1),help(s,1),
	help(p-q,-1),help(q,-1),help(r,-1);
	double ans=1;
	for(int i=0;i<prm.size();i++){
		ans*=pow(double(prm[i]),A[i]);
	}
	printf("%.5lf\n",ans);
 } 
 signed main(){
	init(1e4);
	while(scanf("%d%d%d%d",&p,&q,&r,&s)==4){
		memset(A,0,sizeof A);
		solve();
	}
 }