链接:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1316

题意:

已知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)。
输出保证不超过1e8,保留5位小数。

分析:

首先,求出10000以内的所有素数prime,然后用数组e表示当前结果的唯一分解式中各个素数的指数。
例如,e={1,0,2,0,0,0,…}表示21*52=50。具体实现见代码。

代码:

 1 import java.io.*;
 2 import java.util.*;
 3
 4 public class Main {
 5     static int e[];
 6     static ArrayList<Integer> prime = new ArrayList<Integer>();
 7
 8     static void getPrimeNumber(int up) { // 获取素数
 9         boolean isp[] = new boolean[up+5];
10         Arrays.fill(isp, true);
11         int u = (int)Math.sqrt(up + 0.5);
12         for(int t = 2; t <= u; t++) if(isp[t]) {
13             for(int i = t * t; i <= up; i += t) isp[i] = false;
14         }
15         for(int i = 2; i <= up; i++) if(isp[i]) prime.add(i);
16     }
17
18     static void addInteger(int n, int d) { // 乘以或除以n. d=1表示乘,d=-1表示除
19         for(int i = 0; i < prime.size(); i++) {
20             while(n % prime.get(i) == 0) {
21                 n /= prime.get(i);
22                 e[i] += d;
23             }
24             if(n == 1) break;
25         }
26     }
27
28     static void addFactorial(int n, int d) { // 把结果乘以(n!)的d次方
29         for(int i = 1; i <= n; i++) addInteger(i, d);
30     }
31
32     public static void main(String args[]) {
33         Scanner cin = new Scanner(new BufferedInputStream(System.in));
34         getPrimeNumber(10000);
35         e = new int[prime.size()];
36
37         while(cin.hasNext()) {
38             int p = cin.nextInt();
39             int q = cin.nextInt();
40             int r = cin.nextInt();
41             int s = cin.nextInt();
42
43             Arrays.fill(e, 0);
44             addFactorial(p, 1);
45             addFactorial(q, -1);
46             addFactorial(p-q, -1);
47             addFactorial(r, -1);
48             addFactorial(s, 1);
49             addFactorial(r-s, 1);
50             double ans = 1;
51             for(int i = 0; i < prime.size(); i++)
52                 ans *= Math.pow(prime.get(i), e[i]);
53             System.out.printf("%.5f\n", ans);
54         }
55         cin.close();
56     }
57 }

转载于:https://www.cnblogs.com/hkxy125/p/8855457.html

UVa 10375 - Choose and divide(唯一分解定理)相关推荐

  1. UVa 10375 Choose and divide

    题目大意:给出p,q,s和r, 计算C(p, q) / C(s, r), 公式题目已经给出. 解题思路:以为C(p,q) = C(p,p - q), 所以要尽量选择计算量交少的,边乘边除. #incl ...

  2. Choose and divide(唯一分解定理)

    首先说一下什么是唯一分解定理 唯一分解定理:任何一个大于1的自然数N,如果N不是质数,那么N可以分解成有限个素数的乘积:例:N=(p1^a1)*(p2^a2)*(p3^a3)......其中p1< ...

  3. 欧几里得算法与唯一分解定理

    整理的算法模板合集: ACM模板 目录 最大公约数与最大公倍数 唯一分解定理 快速分解质因子 最大公约数与最大公倍数 最多O(logn)O(logn)O(logn) int gcd(int a, in ...

  4. UVa10375 Choose and divide

    http://vjudge.net/problem/UVA-10375 组合数除以组合数-- 用唯一分解定理将每个乘数和除数分解质因数,统计每个质因数的使用次数(乘一次+1,除一次-1),所有数分解完 ...

  5. FZU 1075 分解素因子【数论/唯一分解定理/分解素因子裸模板】

    [唯一分解定理]:https://www.cnblogs.com/mjtcn/p/6743624.html 假设x是一个正整数,它的值不超过65535(即1<x<=65535),请编写一个 ...

  6. 唯一分解定理(算术基本定理)详解——hdu5248和lightoj1341

    算数分解定理(唯一分解定理): 定义: 任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积 N=P1a1 P2a2P3a3-Pnan,这里P1<P2<P3-& ...

  7. Gym-101466K Random Numbers(线段树,数学,唯一分解定理)

    给一棵树,树上每个节点有一个权值,有两个操作,RAND操作查询u的子树乘积是多少以及有多少因数,SEED操作把节点u乘上v n,q <= 1e5.数值小于等于1e9,最大的质因数不超过13 组队 ...

  8. LightOJ - 1236 (唯一分解定理)

    题意:求有多少对数对(i,j)满足lcm(i,j) = n,1<=i<=j, 1<=n<=1e14. 分析:根据整数的唯一分解定理,n可以分解为(p1^e1)*(p2^e2)* ...

  9. 牛客 - 阶乘(唯一分解定理)

    题目链接:点击查看 题目大意:给出一个 p ,求出最小的 n! 使得 p 可以整除 n! 题目分析:因为 p 高达 1e9 ,可以考虑sqrt(n)的算法,也就是唯一分解定理了,分解之后对于每个质因子 ...

最新文章

  1. [mvc] 简单的forms认证
  2. JavaScript权威指南 - 函数
  3. 十年前,他如何自学技术进阿里?
  4. Outlier Detection for Improved Data Quality and Diversity in Dialog Systems-学习笔记
  5. win主机ping不通linux的IP
  6. Centos Docker 安装 Redis 并测试使用记录
  7. CentOS 7/RHEL 7忘记root密码最简单的修改方法
  8. 哈利波特:哈迷们集合啦
  9. vi毕业设计参考文献优秀范例
  10. VR眼镜连接android设备,VR眼镜怎么连接手机 VR眼镜使用教程
  11. linux mkv转mp4,Linux DVD 转 MP4 – HandBrake – Copy a DVD to MP4 or MKV file
  12. java:/comp/env_启动日志中就出现[java:comp/env/spring.liveBeansView.mbeanDomain] not found这个日志...
  13. 项目经理的工作就是胡搅蛮缠满地打滚
  14. (信贷风控十五)评分卡分数切分、授信额度与利率定价
  15. 两种降维方法的总结——LLE(局部线性嵌入),ISOMAP(等度量映射)
  16. OpenCV——二值图像连通域分析
  17. 《算竞(紫书)》笔记1 STL入门
  18. 从键盘上输入长方形的长和宽,求长方形的周长和面积。
  19. Facebook登录-前端网页以及在angular中的使用方法
  20. linux云计算主要就业岗位有哪些

热门文章

  1. 并发编程——线程——Thread对象的属性和方法
  2. 《机器学习》 —— 第二章:模型评估与选择 学习笔记
  3. 【MFC】带背景的工具栏
  4. 一个不错的shell 脚本入门教程
  5. TCP/IP学习笔记(七)四次挥手
  6. Python解释器工作原理与jit技术
  7. SENet(Squeeze-and-Excitation Networks)
  8. InsightFace及其mxnet、tensorflow代码实现
  9. javaweb利用servlet与struts2实现可点击刷新的基础图片验证码
  10. C语言代码规范(编程规范)