紫书例题10-3 Uva10375 唯一分解定理
2017-01-11 10:03
309 查看
题意:已知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(m,n);
但是我们会发现C(10000,5000),早已超出了计算机整数的表示范围,不过输出保证了不超过10^8,所以本题我们使用唯一分解定理进行求解,通过将其分解为指数幂次相乘的形式即可。
代码如下:
分析:初步分析,本题时间上基本上没有太大的限制,可以暴力求解C(m,n);
但是我们会发现C(10000,5000),早已超出了计算机整数的表示范围,不过输出保证了不超过10^8,所以本题我们使用唯一分解定理进行求解,通过将其分解为指数幂次相乘的形式即可。
代码如下:
// //Created by BLUEBUFF 2016/1/11 //Copyright (c) 2016 BLUEBUFF.All Rights Reserved // #pragma comment(linker,"/STACK:102400000,102400000") //#include <ext/pb_ds/assoc_container.hpp> //#include <ext/pb_ds/tree_policy.hpp> //#include <ext/pb_ds/hash_policy.hpp> //#include <bits/stdc++.h> #include <set> #include <map> #include <queue> #include <stack> #include <cmath> #include <cstdio> #include <time.h> #include <cstdlib> #include <cstring> #include <complex> #include <sstream> //isstringstream #include <iostream> #include <algorithm> using namespace std; //using namespace __gnu_pbds; typedef long long LL; typedef unsigned long long uLL; typedef pair<int, LL> pp; #define REP1(i, a, b) for(int i = a; i < b; i++) #define REP2(i, a, b) for(int i = a; i <= b; i++) #define REP3(i, a, b) for(int i = a; i >= b; i--) #define CLR(a, b) memset(a, b, sizeof(a)) #define MP(x, y) make_pair(x,y) template <class T1, class T2>inline void getmax(T1 &a, T2 b) { if (b>a)a = b; } template <class T1, class T2>inline void getmin(T1 &a, T2 b) { if (b<a)a = b; } const int maxn = 10010; const int maxm = 1e5+5; const int maxs = 10; const int maxp = 1e3 + 10; const int INF = 1e9; const int UNF = -1e9; const int mod = 1e9 + 7; const int rev = (mod + 1) >> 1; // FWT const double PI = acos(-1); //head bool vis[maxn]; int prime[maxn], rear; void getprime(){ memset(vis, 0, sizeof(vis)); int m = sqrt(maxn); for(int i = 2; i <= m; i++){ if(!vis[i]){ for(int j = i * i; j < maxn; j += i){ vis[j] = 1; } } } rear = 0; for(int i = 2; i < maxn; i++){ if(!vis[i]){ prime[rear++] = i; } } } int e[maxn]; void add_integer(int n, int d){ for(int i = 0; i < rear; i++){ while(n % prime[i] == 0){ n /= prime[i]; e[i] += d; } if(n == 1) break; } } void add_factorial(int n, int d){ for(int i = 1; i <= n; i++){ add_integer(i, d); } } int main() { int p, q, r, s; getprime(); while(cin >> p >> q >> r >> s){ memset(e, 0, sizeof(e)); add_factorial(p, 1); add_factorial(q, -1); add_factorial(p - q, -1); add_factorial(r, -1); add_factorial(s, 1); add_factorial(r - s, 1); double ans = 1; for(int i = 0; i < rear; i++){ ans *= pow(prime[i], e[i]); } printf("%.5f\n", ans); } }
相关文章推荐
- 紫书例题 10-4 Uva10791 唯一分解定理
- 【数论】Choose and Divide, UVa10375 【组合数学】【唯一分解定理】【精度】
- uva10375 Choose and Divide(唯一分解定理)
- uva10375(唯一分解定理) Choose and divide
- 例10-3 uva10375(唯一分解定理)
- uva10375(唯一分解定理)
- 例10-3 uva10375(唯一分解定理)
- LightOJ - 1236 Pairs Forming LCM(唯一分解定理)
- poj 1365 Prime Land 唯一分解定理
- 唯一分解定理(Minimum Sum LCM,Uva10791)
- UVA 10375 Choose and divide (唯一分解定理)
- 【数论】Minimum Sum LCM, UVa10791【唯一分解定理】【素数筛法】
- 欧几里得算法和唯一分解定理(数论)
- 2015多校联合第十场hdu5407CRB and Candies数论 唯一分解定理
- 算数基本定理(唯一分解定理)
- 唯一分解定理
- 【定理】算术基本定理(唯一分解定理)
- LightOJ 1236 - Pairs Forming LCM(唯一分解定理)
- Pairs Forming LCM 唯一分解定理
- LightOJ 1341 唯一分解定理