UVa 10375 - Choose and divide(唯一分解定理)
链接:
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。具体实现见代码。
代码:
import java.io.*;
import java.util.*; public class Main {
static int e[];
static ArrayList<Integer> prime = new ArrayList<Integer>(); static void getPrimeNumber(int up) { // 获取素数
boolean isp[] = new boolean[up+5];
Arrays.fill(isp, true);
int u = (int)Math.sqrt(up + 0.5);
for(int t = 2; t <= u; t++) if(isp[t]) {
for(int i = t * t; i <= up; i += t) isp[i] = false;
}
for(int i = 2; i <= up; i++) if(isp[i]) prime.add(i);
} static void addInteger(int n, int d) { // 乘以或除以n. d=1表示乘,d=-1表示除
for(int i = 0; i < prime.size(); i++) {
while(n % prime.get(i) == 0) {
n /= prime.get(i);
e[i] += d;
}
if(n == 1) break;
}
} static void addFactorial(int n, int d) { // 把结果乘以(n!)的d次方
for(int i = 1; i <= n; i++) addInteger(i, d);
} public static void main(String args[]) {
Scanner cin = new Scanner(new BufferedInputStream(System.in));
getPrimeNumber(10000);
e = new int[prime.size()]; while(cin.hasNext()) {
int p = cin.nextInt();
int q = cin.nextInt();
int r = cin.nextInt();
int s = cin.nextInt(); Arrays.fill(e, 0);
addFactorial(p, 1);
addFactorial(q, -1);
addFactorial(p-q, -1);
addFactorial(r, -1);
addFactorial(s, 1);
addFactorial(r-s, 1);
double ans = 1;
for(int i = 0; i < prime.size(); i++)
ans *= Math.pow(prime.get(i), e[i]);
System.out.printf("%.5f\n", ans);
}
cin.close();
}
}
UVa 10375 - Choose and divide(唯一分解定理)的更多相关文章
- UVA - 10375 Choose and divide[唯一分解定理]
UVA - 10375 Choose and divide Choose and divide Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- 【暑假】[数学]UVa 10375 Choose and divide
UVa 10375 Choose and divide 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19601 思路 ...
- uva10375 Choose and Divide(唯一分解定理)
uva10375 Choose and Divide(唯一分解定理) 题意: 已知C(m,n)=m! / (n!*(m-n!)),输入整数p,q,r,s(p>=q,r>=s,p,q,r,s ...
- UVA 10375 Choose and divide【唯一分解定理】
题意:求C(p,q)/C(r,s),4个数均小于10000,答案不大于10^8 思路:根据答案的范围猜测,不需要使用高精度.根据唯一分解定理,每一个数都可以分解成若干素数相乘.先求出10000以内的所 ...
- UVA 10375 Choose and divide(大数的表示)
紫上给得比较奇怪,其实没有必要用唯一分解定理.我觉得这道题用唯一分解只是为了表示大数. 但是分解得到的幂,累乘的时候如果顺序很奇怪也可能溢出.其实直接边乘边除就好了.因为答案保证不会溢出, 设定一个精 ...
- UVA 10375 Choose and divide
n! 分解素因子 快速幂 ei=[N/pi^1]+ [N/pi^2]+ …… + [N/pi^n] 其中[]为取整 ei 为数 N!中pi 因子的个数: #include <iostream& ...
- Uva 10375 选择与除法 唯一分解定理
题目链接:https://vjudge.net/contest/156903#problem/E 题意:已知 求:C(p,q)/C(r,s) 其中p,q,r,s都是10^4,硬算是肯定超数据类型的. ...
- UVA.10791 Minimum Sum LCM (唯一分解定理)
UVA.10791 Minimum Sum LCM (唯一分解定理) 题意分析 也是利用唯一分解定理,但是要注意,分解的时候要循环(sqrt(num+1))次,并要对最后的num结果进行判断. 代码总 ...
- Choose and divide(唯一分解定理)
首先说一下什么是唯一分解定理 唯一分解定理:任何一个大于1的自然数N,如果N不是质数,那么N可以分解成有限个素数的乘积:例:N=(p1^a1)*(p2^a2)*(p3^a3)......其中p1< ...
随机推荐
- .net core 第一篇选择开发工具和环境
.net core 已经发布三年了,社区也逐步成熟.作为微软阵营的一员,忙了一年年底抽点时间系统学习下.学习资料主要为以下为主: 1. https://docs.microsoft.com/zh-cn ...
- C#,动态加载DLL,通过反射,调用参数,方法,窗体
.net中常会用到动态加载DLL,而DLL中可能包含各种参数.方法.窗体,如何来调用动态加载这些参数.方法.窗体呢? 在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系: System. ...
- TortoiseGit记住用户名&密码
配置并安装好git之后鼠标右键: 在全局配置文件末尾添加一行: [credential] helper = store *主意保存时以utf-8格式保存,否则中文可能会乱码,这样下次只需输入一次用户名 ...
- Java 基础(2)——编译运行 & 规范
上节学到 Java 的编译与运行,我们已经学会了怎么去执行一个写好(假装我们已经会写了)的代码,这篇当然要试试手啦 O(∩_∩)O 哈哈~ 小试一下 新建一个 HelloAhanWhite.java ...
- 2019 Java面试题
马上又是一个金九银十的招聘旺季,小编在这里给大家整理了一套各大互联网公司面试都喜欢问的一些问题或者一些出场率很高的Java面试题,给在校招或者社招路上的你一臂之力. 首先我们需要明白一个事实,招聘的一 ...
- java实现mysql的备份还原
此文章是基于 1. 搭建Jquery+SpringMVC+Spring+Hibernate+MySQL平台 2. jquery+springMVC实现文件上传 一. 简介 备份和导入是一个互逆的过程. ...
- 【原创】Hadoop的IO模型(数据序列化,文件压缩)
数据序列化 我们知道,数据在分布式系统上运行程序数据是需要在机器之间通过网络传输的,这些数据必须被编码成一个个的字节才可以进行传输,这个其实就是我们所谓的数据序列化.数据中心中,最稀缺的资源就是网络带 ...
- ugui之圆角矩形头像实现
这个是参考大神的修改了一下渲染方式实现的,可以去查看原帖的,原贴是圆形头像,原理讲的非常详细 点击这里 我写的这个只支持正方形图片,效果是酱紫的~ 一共三个代码,还需要两个代码,原帖里都有的,我只是修 ...
- PAT 1038. Recover the Smallest Number
#include <iostream> #include <cstdlib> #include <vector> #include <algorithm> ...
- 05_ActiveMQ的selectors
[ JMS Selectors ] JMS Selectors用于在订阅中,基于消息属性对消息进行过滤. 以下是个Selectors的例子:Java代码 consumer = session.crea ...