题目大意:
C(m,n)= m!/((m-n)!*n!),给你四个数p,q,r,s,求解C(p,q)/C(r,s)。
解题思路:
根据唯一分解定理,任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积。所以我们可以用一个factor数组保存每一个质因数。具体做法是,比如计算时乘以2,而2只有一个质因数2,那么factor[2]++;反之,如果要处以一个2,那么factor[2]–。 最后遍历factor计算出结果。
参考代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn = 10005;
int factor[maxn];
void Cal(int n,int flag){ //唯一分解定理,flag=1时表示乘,flag=-1时表示除
for(int j=2; j<=n; j++){
int k=j;
for(int i=2; i*i<=k; i++){
if(k%i==0){
while(k%i==0){
factor[i]+=flag;
k/=i;
}
}
}
if(k>1) factor[k] += flag;
}
}
int main(){
int p,q,r,s;
while(cin >> p >> q >> r >> s){
memset(factor,0,sizeof(factor));
int plus =1,reduce = -1; //表示乘除
Cal(p,plus);
Cal(p-q,reduce);
Cal(q,reduce);
Cal(r,reduce);
Cal(r-s,plus);
Cal(s,plus);
int M=max(r,p);
double ans=1;
for(int i=2; i<=M; i++){
while(factor[i]!=0){
if(factor[i]>0){
ans*=i;
factor[i]--;
}
else {
ans /= i;
factor[i]++;
}
}
// if(factor[i]){
// ans = ans*pow(i,factor[i]);
// }
}
printf("%.5f\n",ans);
}
return 0;
}