UVA - 10375Choose and divide(数论)
2014-12-02 22:19
274 查看
UVA - 10375Choose and divide(数论)
题目链接
题目大意:求 C(p,q) / C(r,s)的值。
解题思路:题目给出公式:那么上面的那个式子就等价于(p!s!(r - s)!)/(q!(p - q)!r!)
需要发现q!和 p!/(P - q)!的关系,枚举1..q的值,可以对应得到p.. p - q + 1,对应乘积就是p!/(p - q)! ,同理s!和(r - s)! / r!也是如此,那么只要边枚举q和s,然后边计算值就可以得到最后的结果,但是枚举的时候应该枚举值小的数,那么如果(p - q)比q小的话,那么就枚举1...(p - q),因为C(p,q) = C(p,p - q)。
代码:
题目链接
题目大意:求 C(p,q) / C(r,s)的值。
解题思路:题目给出公式:那么上面的那个式子就等价于(p!s!(r - s)!)/(q!(p - q)!r!)
需要发现q!和 p!/(P - q)!的关系,枚举1..q的值,可以对应得到p.. p - q + 1,对应乘积就是p!/(p - q)! ,同理s!和(r - s)! / r!也是如此,那么只要边枚举q和s,然后边计算值就可以得到最后的结果,但是枚举的时候应该枚举值小的数,那么如果(p - q)比q小的话,那么就枚举1...(p - q),因为C(p,q) = C(p,p - q)。
代码:
#include <cstdio> #include <algorithm> using namespace std; int main () { int p, q, r, s; while (scanf ("%d%d%d%d", &p, &q, &r, &s) != EOF) { q = min (q, p - q); s = min (s, r - s); double ans = 1.0; for (int i = 1; i <= q || i <= s; i++) { if (i <= q) ans = ans * (p - i + 1) / i; if (i <= s) ans = ans * i / (r - i + 1); } printf ("%.5lf\n", ans); } return 0; }
相关文章推荐
- UVa11440 - Help Tomisu(数论)
- 数论 - 高精度Fibonacci数 --- UVa 10183 : How Many Fibs ?
- UVa 10006 Carmichael Numbers(数论&卡米歇尔数&考塞特判别法)
- UVA-11526H(n)(数论)
- UVA 294 294 - Divisors (数论)
- UVA 10515 - Powers Et Al.(数论)
- uva 10780Again Prime? No Time.(简单数论)
- UVA 467 - Synching Signals(数论)
- UVA 10555 - Dead Fraction(数论+无限循环小数)
- UVA10140 Prime Distance【素数/数论】By cellur925
- UVALive 5964 LCM Extreme 数论、LCM、筛选
- UVa 571 - Jugs (数论)
- uva 10555 - Dead Fraction)(数论)
- UVA 568 (暑假-数论 -C - Just the Facts)
- Uva 10339 - Watching Watches【数论,暴力】
- Uva 11971 Polygon(数论、概率)
- UVALive 7040 Color (容斥原理 + 组合数学递推公式 + 求逆元 + 基础数论)
- UVA 10006 Carmichael Numbers(数论+快速幂)
- UVa 568 Just the Facts (数论&打表&不打表)
- UVa 160 Factors ans Factorials(数论)