码迷,mamicode.com
首页 > 其他好文 > 详细

刘汝佳 例题10-3 选择与除法

时间:2016-05-13 10:47:45      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:

 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 }

 

刘汝佳 例题10-3 选择与除法

标签:

原文地址:http://www.cnblogs.com/yfs123456/p/5486059.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!