题目大意:就是两个组合数相除,但是结果保证不会太大,int就可以存下了。
虽然说int可以存下结果但是他的中间过程大呀 具体有多大我也不知道 反正就是很大很大。
这里就用到了素数的唯一分解定理
将两个组合数进行化简之后可以得到
这些阶乘都太大啦 所以要把他分解成一个个素数 每个素数的指数我都将他储存在e数组中
分母的指数用正数来表示 分子的指数用负数来表示
//#include <bits/stdc++.h>
#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <vector>
#include <math.h>
using namespace std;
#define MAXN 10010
vector<int> primer;
int e[MAXN];
void is_primer(int x)
{
bool ok = true;
for (int i = 2; i * i <= x; i++)if (x%i == 0) { ok = false; break; }
if (ok)primer.push_back(x);
}
void solver(int x, int d)
{
for (int k = 2; k <= x; k++)
{
int kk = k;
for (int i = 0; i < primer.size(); i++)
{
while (kk%primer[i] == 0)
{
e[i] += d;
kk /= primer[i];
}
if (kk == 1)break;
}
}
}
void init(void)
{
for (int i = 2; i < MAXN; i++)is_primer(i);
}
int main(void)
{
int p, q, s, r;
init();
while (scanf("%d%d%d%d", &p, &q, &r, &s) != EOF)
{
memset(e, 0, sizeof(e));
solver(p, 1);
solver(s, 1);
solver(r - s, 1);
solver(r, -1);
solver(q, -1);
solver(p - q, -1);
double ans = 1.0;
for (int i = 0; i < primer.size(); i++)ans *= pow((double)primer[i], e[i]);
printf("%.5lf\n", ans);
}
return 0;
}