洛谷 - P2152 - SuperGCD - 高精度
https://www.luogu.org/problemnew/show/P2152
一开始不知道Java可以有gcd,手写了个辗转相除法。
发现Number类在参数传递中传的并非是引用!
最主要要解决的是MLE的问题,经查询得知System.gc()方法可以手动回收内存。
但是它慢得离谱!
我们考虑使用一个cnt计数器来平衡空间和时间的花费。经过试验cnt每800回收一次内存最终可以使花费内存到达32MB。
接近原本内存消耗的1/3!
至于为什么是模800……模200的时候TLE了,瞎蒙一个800。
估计是gcd的复杂度是对数级别的,那么模800大概会回收数十次内存。
这个实现太蠢了其实大数也有mod的……数学mod是mod,计算机%是remainder。减少了很多中间步骤使得时间和空间都有显著提升。
另外。其实也有pow和modPow,甚至有sqrt以及大素数素性测试!
import java.util.*;
import java.math.*; public class Main {
public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
BigInteger A=sc.nextBigInteger();
BigInteger B=sc.nextBigInteger();
sc.close();
System.gc(); BigInteger T1;
int cnt=0;
while(B.compareTo(BigInteger.ZERO)!=0) {
T1=B;
B=A.subtract(A.divide(B).multiply(B));
A=T1; cnt++;
if(cnt%800==0) {
T1=null;
System.gc();
}
}
T1=null;
B=null;
System.out.println(A);
}
}
而模600的话则接近TLE了。
估计模5000应该是比较好的平衡点?在有限的空间中尽可能缩短时间。空间消耗达到80MB,但是速度快至5秒!(模800是大约8秒)
最后,原来BigInteger有内置的gcd方法!
快至2秒,内存消耗17MB!
import java.util.*;
import java.math.*; public class Main {
public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
BigInteger A=sc.nextBigInteger();
BigInteger B=sc.nextBigInteger();
System.out.println(A.gcd(B));
sc.close();
}
}
洛谷 - P2152 - SuperGCD - 高精度的更多相关文章
- 【洛谷p2142】高精度减法
高精度减法第一遍没有过 高精度减法[传送门] 洛谷算法标签: 总之技术都在高精上了吧. 附代码: #include<iostream> #include<cstdio> #in ...
- 洛谷 P2152 [SDOI2009]SuperGCD (高精度)
这道题直接写了我两个多小时-- 主要是写高精度的时候还存在着一些小毛病,调了很久 在输入这一块卡了很久. 然后注意这里用while的形式写,不然会炸 最后即使我已经是用的万进制了,但是交上去还是有两个 ...
- 洛谷 P2152 [SDOI2009]SuperGCD
题意简述 求两个整数a,b的最大公约数0 < a , b ≤ 10 ^ 10000. 题解思路 如果 a % 2 == 0 && b % 2 == 0 gcd(a,b) = gc ...
- AC日记——阶乘之和 洛谷 P1009(高精度)
题目描述 用高精度计算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:5!=5*4*3*2*1. 输入输出格式 输入格式: 一个正整数N. 输出格式: 一个正整数S,表示计算结 ...
- 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂
洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...
- 【洛谷2624_BZOJ1005】[HNOI2008] 明明的烦恼(Prufer序列_高精度_组合数学)
题目: 洛谷2624 分析: 本文中所有的 "树" 都是带标号的. 介绍一种把树变成一个序列的工具:Prufer 序列. 对于一棵 \(n\) 个结点的树,每次选出一个叶子(度数为 ...
- 洛谷 P3182 [HAOI2016]放棋子(高精度,错排问题)
传送门 解题思路 不会错排问题的请移步——错排问题 && 洛谷 P1595 信封问题 这一道题其实就是求对于每一行的每一个棋子都放在没有障碍的地方的方案数. 因为障碍是每行.每列只有一 ...
- 【题解】洛谷P1080 [NOIP2012TG] 国王游戏(贪心+高精度)
次元传送门::洛谷P1080 思路 我们模拟一下只有两个大臣的时候发现 当a1∗b1<a2∗b2是ans1<ans2 所以我们对所有大臣关于左右手之积进行排序 得到最多钱的大臣就是 ...
- NOIP2012 Day1 T2国王游戏 洛谷P1080
第一篇博客啊…… 由于我太弱了,还要去补不全的知识点准备参加人生第一次NOIp,所以第一篇博客就简短一点好了(偷懒就直说吧……) 洛谷P1080传送门 题意概括: 有N对数ai和bi,以及两个数a0和 ...
随机推荐
- 在windows中增加linux命令
在windows中增加linux命令 无它,复用git中的即可:
- SolidEdge 工程图中如何快速将同一类元素放到同一个图层
在图层选项卡中新建一个尺寸线图层 点击聪慧选项(把它点凹下去),然后点击任意尺寸线,弹出聪慧选取选项,点击确定,则自动选择了所有尺寸线 点击移动图元,把刚才选中的所有尺寸线都移动到这个图层即可 ...
- takeLatest 如何接受 this.props.dispatch 传递的参数
1.步骤一 // 获取查询参数 getQueryParams(params){ // 请求月考核分的数据 this.props.dispatch({ type:'getMonthlyAssessmen ...
- font-family,font-size,color
CreateTime--2017年12月20日16:43:35 Author:Marydon css设置字体样式 1.font-family 语法:属性值可以有一个或多个,多个值之间使用逗号隔开. ...
- 关于UDID和UUID的区别
关于UDID和UUID的区别 一.UDID(Unique Device Identifier) UDID是Unique Device Identifier的缩写,中文意思是设备唯一标识. 在很多需 ...
- DSL 如何工作
DSL 如何工作 http://computer.howstuffworks.com/dsl.htm 当你连接到因特网时,你可能是通过一个调制解调器 (modem),或办公室的局域网,或者一个电缆调制 ...
- 在git push前怎样遗弃掉历史commit
今天写了一天代码,然后 git hub commit 了 多达 7 次. 可是都没有把改动正式推送上去. 结果最后要推送的时候发现中间有一个提交文件超过了100M. 是 vs 的代码性能分析报告 .v ...
- [转]XCode中修改缺省公司名称/开发人员名称
本文转载至 http://www.cnblogs.com/zhulin/archive/2011/11/24/2261537.html XCode新建文件后,头部会有开发人员名称,公司名称等信息 ...
- iOS RAC常用方法
一直想写篇关于RAC的文章,一是分享二是做为笔记,由于项目忙先简单的贴一个自己当初学习的时候代码吧 一.RACCommand // RACCommand 的使用: 使用场景,监听按钮点击,网络请求 - ...
- 基于mqtt协议实现手机位置跟踪
Mqtt协议是物联网领域的一个标准协议,具有轻巧,对设备,带宽要求低,可靠稳定的特点,适合用来实现手机定位跟踪功能. 目前我初步搭建起来了整个可运行的框架,大致为如下思路:1.手机端通过位置服务,获取 ...