链接:https://vjudge.net/problem/UVA-10375
题意:给定公式 C(m,n) = m!/((m-n)!*n!)),给定4个数p,q,r,s,求C(p,q)/C(r,s);
思路:为阶层的每一个数用唯一分解定理分解。
这种大数相除精度高的题要用唯一分解定理。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;
int prime[10005],e[10005];
vector<int> vec;
void Prime(){
for(int i = 2;i<=10000;++i){
prime[i] = 1;
}
for(int i = 2;i<=10000;++i){
if(prime[i] == 1){
vec.push_back(i);
for(int j = i*i;j<=10000;j+=i)
prime[i] = 0;
}
}
}
void solve(int n,int d){ //唯一分解定理主体部分
for(int i = 0;i<vec.size();++i){
while(n%vec[i] == 0){
e[i] += d;
n /= vec[i];
}
if(n == 1)
return;
}
}
void add(int n, int d) {
for(int i = 1; i <= n; i++)
solve(i, d);
}
int main(){
int p,q,r,s;
double ans;
Prime();
while(cin>>p>>q>>r>>s){
memset(e,0,sizeof(e));
add(p,1);
add(p-q,-1);
add(q,-1);
add(r,-1);
add(r-s,1);
add(s,1);
ans = 1.0;
for(int i = 0;i<vec.size();++i){
ans *= pow(vec[i],e[i]);
}
printf("%.5lf\n",ans);}
return 0;
}