求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(); } }