1 #include2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 8 const int maxn = 10000; 9 vector primes;10 int e[maxn];11 12 /**13 add_factorial(int n, int d)计算(n!)^d,其思路是这样的:14 首先弄清楚add_integer(int n, int d)的作用:求n的质因子对应的指数。15 n!是连乘的关系,所以逐个求解n的质因子对应的指数,在原来求解的值上16 累加即可。e[i] += d;当d = 1,时表示n能被primes[i]整除,即primes[i]17 是n的一个质因子,就在e[i]的位置上+1。18 整个函数执行完毕就是唯一分解定理的代码化。即用代码求解了19 n! = p1^a1 * p2^a2 * p3^a3 *···*pn^an20 */21 22 // 乘以或除以n. d=0表示乘,d=-1表示除23 void add_integer(int n, int d) { ///求n的质因子对应的指数24 for(int i = 0; i < primes.size(); i++) {25 while(n % primes[i] == 0) { ///循环求对应质因子primes[i]的指数26 n /= primes[i];27 e[i] += d;28 }29 if(n == 1) break; // 提前终止循环,节约时间30 }31 }32 33 void add_factorial(int n, int d) {34 for(int i = 1; i <= n; i++)35 add_integer(i, d);36 }37 38 bool is_prime(int n) {39 int m = floor(sqrt(n) + 0.5);40 for(int a = 2; a <= m; a++)41 if(n % a == 0) return false;42 return true;43 }44 45 int main() {46 for(int i = 2; i <= 10000; i++)///求解2-10000之间的素数47 if(is_prime(i)) primes.push_back(i);48 int p, q, r, s;49 while(cin >> p >> q >> r >> s) {50 memset(e, 0, sizeof(e));51 ///C(p,q)52 add_factorial(p, 1);53 add_factorial(q, -1);54 add_factorial(p-q, -1);55 ///C(r,s)56 add_factorial(r, -1);57 add_factorial(s, 1);58 add_factorial(r-s, 1);59 double ans = 1;60 for(int i = 0; i < primes.size(); i++)61 ans *= pow(primes[i], e[i]);62 printf("%.5lf\n", ans);63 }64 return 0;65 }