GCD LCM 最大公约数 最小公倍数 分数模板 (防溢出优化完成)
自己写的一个分数模板,在运算操作时进行了防溢出的优化:
ll gcd(ll a, ll b) {
return b ? gcd(b, a%b) : a;
}
ll lcm(ll a, ll b) {
return a / gcd(a,b) * b;
}
struct divi {
ll a = ,b = ;
};
divi simdiv(divi a) {
ll i;
divi divn = a;
ll k = gcd(a.a,a.b);
divn.a /= k;
divn.b /= k;
if(divn.b < ) {
divn.a = -divn.a;
divn.b = -divn.b;
}
return divn;
}
divi plusdiv(divi i,divi j) {
divi a = simdiv(i);
divi b = simdiv(j);
divi dn;
dn.b = lcm(a.b,b.b);
dn.a = a.a*(dn.b/a.b)+b.a*(dn.b/b.b);
return simdiv(dn);
}
divi minusdiv(divi i,divi j) {
divi a = simdiv(i);
divi b = simdiv(j);
divi dn;
dn.b = lcm(a.b,b.b);
dn.a = a.a*(dn.b/a.b)-b.a*(dn.b/b.b);
return simdiv(dn);
}
divi muldiv(divi i, divi j) {
divi a = simdiv(i);
divi b = simdiv(j);
divi dn;
ll chu1 = gcd(a.a,b.b);
ll chu2 = gcd(a.b,b.a);
dn.b = (a.b/chu2) * (b.b/chu1);
dn.a = (a.a/chu1) * (b.a/chu2);
return simdiv(dn);
}
divi divdiv(divi i,divi j) {
divi a = simdiv(i);
divi b = simdiv(j);
divi dn;
ll chu1 = gcd(a.a,b.a);
ll chu2 = gcd(a.b,b.b);
dn.b = (a.b / chu2) * (b.a / chu1);
dn.a = (a.a / chu1) * (b.b / chu2);
return simdiv(dn);
}
int cmpdiv(divi i,divi j) { //a>b返回1, a=b返回0, a<b返回-1, 无法比较返回INF
divi a = simdiv(i);
divi b = simdiv(j);
if(a.b == || b.b == ) {
if(a.b == && b.b == ) return INF;
else {
if(a.b == ) {
if(a.a > ) return ;
if(a.a < ) return -;
if(a.a == ) return INF;
} else {
if(b.b == ) {
if(b.a > ) return -;
if(b.a < ) return ;
if(b.a == ) return INF;
}
}
}
} else {
ll di = lcm(a.b,b.b);
ll a1 = a.a * (di / a.b);
ll a2 = b.a * (di / b.b);
if(a1 > a2) return ;
if(a1 == a2) return ;
if(a1 < a2) return -;
}
}
double valueofdiv(divi a) {
if(a.a == ) return ;
if(a.b == ) {
if(a.a >= ) return (double)INF;
if(a.a < ) return -(double)INF;
}
return (double)a.a/(double)a.b;
}
测试代码:
divi a,b;
while(==) {
scanf("%lld%lld",&a.a,&a.b);
scanf("%lld%lld",&b.a,&b.b);
printf("+: %lld/%lld\n",plusdiv(a,b).a,plusdiv(a,b).b);
printf("-: %lld/%lld\n",minusdiv(a,b).a,minusdiv(a,b).b);
printf("*: %lld/%lld\n",muldiv(a,b).a,muldiv(a,b).b);
printf("/: %lld/%lld\n",divdiv(a,b).a,divdiv(a,b).b);
printf("cmp: %d\n",cmpdiv(a,b));
printf("value: %lf %lf\n",valueofdiv(a),valueofdiv(b));
}
GCD LCM 最大公约数 最小公倍数 分数模板 (防溢出优化完成)的更多相关文章
- 数论入门2——gcd,lcm,exGCD,欧拉定理,乘法逆元,(ex)CRT,(ex)BSGS,(ex)Lucas,原根,Miller-Rabin,Pollard-Rho
数论入门2 另一种类型的数论... GCD,LCM 定义\(gcd(a,b)\)为a和b的最大公约数,\(lcm(a,b)\)为a和b的最小公倍数,则有: 将a和b分解质因数为\(a=p1^{a1}p ...
- 数论3——gcd&&lcm
gcd(a, b),就是求a和b的最大公约数 lcm(a, b),就是求a和b的最小公倍数 然后有个公式 a*b = gcd * lcm ( gcd就是gcd(a, b), ( •̀∀•́ ) ...
- Mathematics:GCD & LCM Inverse(POJ 2429)
根据最大公约数和最小公倍数求原来的两个数 题目大意,不翻译了,就是上面链接的意思. 具体思路就是要根据数论来,设a和b的GCD(最大公约数)和LCM(最小公倍数),则a/GCD*b/GCD=LCM/G ...
- POJ 2429 GCD & LCM Inverse(Pollard_Rho+dfs)
[题目链接] http://poj.org/problem?id=2429 [题目大意] 给出最大公约数和最小公倍数,满足要求的x和y,且x+y最小 [题解] 我们发现,(x/gcd)*(y/gcd) ...
- hdu-3071 Gcd & Lcm game---质因数分解+状态压缩+线段树
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3071 题目大意: 给定一个长度为n的序列m次操作,操作的种类一共有三种 查询 L :查询一个区间的所 ...
- 最大公约数&&最小公倍数
//最大公约数(greatest common divisor),运用递归 int gcd(int a,int b){//注意a要求大于b return !b?a:gcd(b,a%b); } //最小 ...
- O(n log log n)实现FGT和FLT(Fast GCD/LCM Transformation)
本文是作者看不懂分治FFT之后开始娱乐一下自己写的 看到一道题时候询问了正解后,推出了一个奇怪的变换,发现这个很Transformation,我和正解推出来的奇怪的东西是一样的,但还是想写一下思路.. ...
- C - GCD LCM
Description The GCD of two positive integers is the largest integer that divides both the integers w ...
- 7-6 jmu_python_最大公约数&最小公倍数 (10 分)
本题要求从键盘输入两个整数(以逗号间隔),编程求出这两个数的最大公约数和最小公倍数 提示:求最大公约数可用辗转相除法,最小公倍数用两数的积除以最大公约数 输入格式: 在一行中输入两个整数,以逗号间隔 ...
随机推荐
- Linux学习——目录结构
在Linux当中,一切皆为文件,包括目录也属于文件.FHS(Filesystem Hierarchy Standard)的出现对文件目录系统做出了统一规范. Linux的目录结构: / - 根 /bi ...
- some small knowledge
cookie 增查 <!--1.语义化标签的作用--> <!--1.1 从开发角度考虑是提高代码的可读性可维护性--> <!--1.2 网站的发布者:seo 搜索引擎优化 ...
- JavaScript创建对象的三种方法
在 JavaScript 中我们知道无法通过类来创建对象,那么如何创建对象呢? (1)通过“字面量”方式创建对象 将你的信息写到{ }中,并赋值给一个变量,此时这个变量就是一个对象,例: var ga ...
- SpringCloud微服务实战:一、Eureka注册中心服务端
1.项目启动类application.java类名上增加@EnableEurekaServer注解,声明是注册中心 1 import org.springframework.boot.SpringAp ...
- ETO的公开赛T1《矿脉开采》题解(正解)(by Zenurik)
作为T1,当然是越水越好啦qwq 显然经目测可得,那个所谓的质量评级根本就没卵用,可以直接\(W_i = W_i^{V_i}\)累积到利润里面. 这样,本问题显然是一个"子集和"问 ...
- 范围for语句的整理
1.如何处理stirng中的每个字符?(来自C++Primer中文版5th中P83) 使用基于范围的for语句,比如下面的例子,输出每个字符 #include<iostream> #inc ...
- leetcode笔记(三)207. Course Schedule
题目描述(原题目链接) There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may ...
- 爬虫——GET请求和POST请求
urllib.parse.urlencode()和urllib.parse.unquote() 编码工作使用urllib.parse的urlencode()函数,帮我们将key:value这样的键值对 ...
- SSM框架理解搭建(虽然是网上拼的,但是实际按照搭建是可以的)——
SpringSpring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象.Spring的核心思想是IoC(控制反转),即不再需要程序员去显式地 ...
- PHP中对字符串的一些操作
php中判断字符串在另一个字符串中是否存在(strpos): if(strpos('www.baidu.com', 'www') !== false){ // 存在 }else{ // 不存在 } p ...