题意:
求解C(m,n) / C(r,s)
利用每个数的唯一分解试,然后用一个辅助数组写出素数的指数
最后在统一计算
(开始手打快速幂,发现我SB,会出现负数)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn = 5000;
int num[maxn<<2],primes[maxn],e[maxn];
int ans = 0;
void GetPrimes() {
for(int i = 2; i <= 10000; ++i)
{
if(!num[i]) {
primes[ans++] = i;
for(int j = i; j <= 10000; j += i)
num[j] = 1;
}
}
}
void Add_intger(int n,int d) {
for(int i = 0;i < ans; i++) {
while(n % primes[i] ==0)
{
n /= primes[i];
e[i] += d;
}
if(n == 1) break;
}
}
void Add(int n,int d) {
for(int i = 1; i <= n; ++i)
Add_intger(i,d);
}
int main () {
GetPrimes();
//cout << ans << endl;
//for(int i = 0 ; i < ans; ++i) cout << primes[i] << " ";
int p,q,r,s;
//cout << Pow(2,10) << endl;
while(cin >> p >> q >> r >> s) {
memset(e,0,sizeof(e));
Add(p,1),Add(q,-1),Add(p-q,-1);
Add(r,-1),Add(s,1),Add(r-s,1);
double val = 1;
for(int i = 0; i < ans; ++i)
{
val *= pow(primes[i],e[i]);
}
printf("%.5lf\n",val);
}
return 0;
}