题目大意:c(m,n)=(m!)/(n!(m-n)!),现在输入整数p,q,r,s,计算c(p,q)/c(r,s).
此题用到了唯一分解定理,因为假如直接计算阶乘的话肯定会超过数的存储范围,所以可以先把n!里的每个数分解成素数乘积,这样的话在计算的时候假如是分子项的话直接在相应的素数系数上加就行了,如果是分母项就直接减去就行了.
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int e[200000],primes[20000],k;
int prime(int n)
{
for(int i=2;i<n/2+1;i++)
if(n%i==0)
return 0;
return 1;
}
void add_integer(int n,int d)
{
for(int i=0;i<k;i++)
{
while(n%primes[i]==0)
{
n/=primes[i];
e[i]+=d;
}
if(n==1)break;
}
}
void solve(int n,int d)
{
for(int i=1;i<=n;i++)
add_integer(i,d);
}
int main()
{
int p,q,r,s;
while(~scanf("%d%d%d%d",&p,&q,&r,&s))
{
memset(e,0,sizeof(e));
k=0;
for(int i=2;i<10001;i++)
{
if(prime(i))
primes[k++]=i;
}
solve(p,1);
solve(q,-1);
solve(p-q,-1);
solve(r,-1);
solve(s,1);
solve(r-s,1);
double ans=1;
for(int i=0;i<k;i++)
ans*=pow(primes[i],e[i]);
printf("%.5lf\n",ans);
}
return 0;
}