求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();
}
}
浙公网安备 33010602011771号