UVa 10375 (唯一分解定理) Choose and divide

题意:

求组合数C(p, q) / C(r, s)结果保留5为小数。

分析:

先用筛法求出10000以内的质数,然后计算每个素数对应的指数,最后再根据指数计算答案。

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstring>
 4
 5 const int maxn = 10000;
 6 int pri[maxn], cnt, e[maxn];    //e记录每个素数的质数
 7 bool vis[maxn + 10];
 8
 9 void add_interger(int n, int d)    //乘以n的d次幂
10 {
11     for(int i = 0; i < cnt; ++i)
12     {
13         while(n % pri[i] == 0)
14         {
15             n /= pri[i];
16             e[i] += d;
17         }
18         if(n == 1) return;
19     }
20 }
21
22 void add_factorial(int n, int d)    //乘以(n!)的d次幂
23 {
24     for(int i = 2; i <= n; ++i)
25         add_interger(i, d);
26 }
27
28 int main()
29 {
30     //freopen("10375in.txt", "r", stdin);
31
32     int m = sqrt(maxn + 0.5);
33     for(int i = 2; i <= m; ++i) if(!vis[i])
34         for(int j = i*i; j <= maxn; j += i) vis[j] = true;
35     cnt = 0;
36     for(int i = 2; i < maxn; ++i) if(!vis[i]) pri[cnt++] = i;
37     //for(int i = 0; i < 10; ++i) printf("%d\n", pri[i]);
38
39     int p, q, r, s;
40     while(scanf("%d%d%d%d", &p, &q, &r, &s) == 4)
41     {
42         memset(e, 0, sizeof(e));
43
44         add_factorial(p, 1);
45         add_factorial(q, -1);
46         add_factorial(p-q, -1);
47         add_factorial(r, -1);
48         add_factorial(s, 1);
49         add_factorial(r-s, 1);
50
51         double ans = 1.0;
52         for(int i = 0; i < cnt; ++i)
53             ans *= pow(pri[i], e[i]);
54
55         printf("%.5f\n", ans);
56     }
57
58     return 0;
59 }

代码君

时间: 2024-08-01 22:44:55

UVa 10375 (唯一分解定理) Choose and divide的相关文章

uva 10375 唯一分解定理 筛法求素数【数论】

唯一分解理论的基本内容: 任意一个大于1的正整数都能表示成若干个质数的乘积,且表示的方法是唯一的.换句话说,一个数能被唯一地分解成质因数的乘积.因此这个定理又叫做唯一分解定理. 举个栗子:50=(2^1)*(5^2) 题目一般的思路就是要把素数表打出来,eg上面的例子 e={1,0,2,0,0......} 下面是两个题目,仅说说大致的思想: 题目一: E=(X1*X3*X4* ...*Xk)/X2   判断E是不是整数 如果把(X1*X3*X4* ...*Xk)分解成素数相乘,将X2也分解成素

UVA 10791 -唯一分解定理的应用

#include<iostream> #include<stdio.h> #include<algorithm> #include<string.h> #include<math.h> #define ll long long using namespace std; int main(){ int n; int k=0; while(1){ k++; scanf("%d",&n); if (n==0)break; i

UVA 10375 Choose and divide(唯一分解定理)

这么大数的乘法.除法运算,肯定不能先全部乘起来,我的思路是计算出分子.分母上的每个数的个数(因为最大的数为10000,可以开一个数组记录个数). 利用了随机数方法终于知道错在哪了,中间如果出现连乘还是会溢出,这点没想到,以下是我的溢出代码: #include<stdio.h> #include<math.h> #include<iostream> #include<string.h> #include<stdlib.h> #include<

UVA 10375 Choose and divide【唯一分解定理】

题意:求C(p,q)/C(r,s),4个数均小于10000,答案不大于10^8 思路:根据答案的范围猜测,不需要使用高精度.根据唯一分解定理,每一个数都可以分解成若干素数相乘.先求出10000以内的所有素数,用a数组表示唯一分解式中个素数的指数,求出每个分子部分的素因子,并且相应的素数的指数加一.分母则减一.最后求解唯一分解式的值. #include<stdio.h> #include<string.h> #include<math.h> const int N=1e4

Choose and divide UVA - 10375(筛素法+唯一分解定理的应用)

通过题目给的定义C(m,n)=m!/(n!(m-n)!),以及题目要求计算的C(p,q)/C(r,s)联立可得 p!s!(r-s)!/q!r!(p-q)! 看到这个式子,我们可以分析一下,我们可以将每个阶乘,都通过唯一分解定理将它们分解 (具体教程可见:https://blog.csdn.net/qq_39439314/article/details/78270905) 所以,首先我们应该先求出10000以内的所有素数,然后通过唯一分解定理将各个阶乘都分解,求出所有存在的可用质数以及对应的质数的

UVa 10375 Choose and divide (唯一分解定理)

题目 题目大意 已知\(C(m, n) = m! / (n!(m - n)!)\), 输入整数\(p\), \(q\), \(r\), \(s\)(\(p ≥ q\), \(r ≥ s\), \(p\), \(q\), \(r\), \(s ≤ 10000\)), 计算\(C(p, q) / C(r, s)\).输出保证不超过\(10^8\), 保留\(5\)位小数 题解 这道题还是挺水吧... 首先如果直接算出\(C(p, q)\)和\(C(r, s)\)是肯定不可能的, C++存不下这么大的

10375 - Choose and divide(唯一分解定理的运用 eratosthenes构造素数表)

我觉得数学类的题目,每一道都有很好的解决方法,都很有保存的意义和价值. 这道题目里面,巧妙地运用了 唯一分解定理,辅以素数的eratosthenes筛法构造,很好地解决了题目.值得思考和深入的学习. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; vector<int>

UVA 10375 Choose and divide(数论)

The binomial coefficient C(m,n) is defined as m! C(m,n) = -------- n!(m-n)! Given four natural numbers p, q, r, and s, compute the the result of dividing C(p,q) by C(r,s). The Input Input consists of a sequence of lines. Each line contains four non-n

【暑假】[数学]UVa 10375 Choose and divide

UVa 10375 Choose and divide 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19601 思路: maxn=10000 如果计算maxn!再保存的话显然装不下. 但答案由阶乘的积或商组成,所以可以用唯一分解定理求解.大题思路就是把目前答案的质因子的指数用数组e保存,乘除都对e操作. 需要注意的是筛法求素数优化后的写法. 代码: 1 #include<iostream> 2 #include