根据组合数定义直接唯一分解每个数。
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <iostream>
#include <list>
#include <cmath>
using namespace std;
const int maxn=1e4+5;
int p,q,r,s;
int vis[maxn],ans[maxn];
vector<int> prime;
void fen(int n,int pow)
{
for(int i=0;i<prime.size();i++)
{
while(n%prime[i]==0)
{
n/=prime[i];
ans[i]+=pow;
}
if(n==1) break;//算是个技巧,提前结束
}
}
void divide(int n,int pow)
{
for(int i=2;i<=n;i++)
fen(i,pow);
}
int main()
{
memset(vis,0,sizeof(vis));
for(int i=2;i<=10000;i++)
{
if(!vis[i])
{
prime.push_back(i);
for(int j=i*2;j<10000;j+=i)
vis[j]=1;
}
}
while(scanf("%d%d%d%d",&p,&q,&r,&s)!=EOF)
{
memset(ans,0,sizeof(ans));
divide(p,1);//传进去1表示乘以,传进去-1表示除以,正好是素数幂次数加减一
divide(s,1);
divide(r-s,1);
divide(q,-1);
divide(p-q,-1);
divide(r,-1);
double anw=1;
for(int i=0;i<prime.size();i++)
anw*=pow(prime[i],ans[i]);
printf("%.5lf\n",anw);
}
return 0;
}