标签:
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<vector> 5 #include<iostream> 6 using namespace std; 7 8 const int maxn = 10000; 9 vector<int> 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^an 20 */ 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 }
标签:
原文地址:http://www.cnblogs.com/yfs123456/p/5486059.html