X星球的某个大奖赛设了 M 级奖励。
每个级别的奖金是一个正整数。
并且,相邻的两个级别间的比例是个固定值。
也就是说:所有级别的奖金数构成了一个等比数列。
比如:16,24,36,54,其等比值为:3/2。
现在,我们随机调查了一些获奖者的奖金数。
请你据此推算可能的最大的等比值。

输入格式
第一行为数字 N ,表示接下的一行包含 N 个正整数。

第二行 N 个正整数 Xi,用空格分开,每个整数表示调查到的某人的奖金数额。

输出格式
一个形如 A/B 的分数,要求 A、B 互质,表示可能的最大比例系数。

数据范围
0<N<100
0<Xi<1012
数据保证一定有解。

输入样例1:
3
1250 200 32
输出样例1:
25/4
输入样例2:
4
3125 32 32 200
输出样例2:
5/2
输入样例3
3
549755813888 524288 2
输出样例3:
4/1


假设原数列为 a,a*(p/q)^1, a*(p/q)^2,…, a*(p/q)^(n-1)
假设抽取的数列 b0,b1,…,b(N-1) (从小到大排好序了)
b1/b0,b2/b0,…,b(N-1)/b0–> (p/q)^x1, (p/q)^x2,…, (p/q)^x(N-1)
我们要求的是: (p/q)^k (p/q)>1,所以使k最大,即求(p/q)^x1~ (p/q)^x(N-1)的最大公约数,其实就是求x1~x(N-1)的最大公约数
//这里我们使用更相减损术,因为我们没有得到确切的x1~x(N-1)是多少,我们只有(p/q)^x1, (p/q)^x2,…, (p/q)^x(N-1)这些的值

更相减损术:第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2的积与第二步中等数的乘积就是所求的最大公约数。

更相减损术总用较大的减去较小的
例子:
98-63=35
63-35=28
35-28=7
28-7=21
21-7=14
14-7=7
所以,98和63的最大公约数等于7。

我们这里要用更相减损术的是指数,所以要让(p/q)^x1 ,(p/q)^x2,…, (p/q)^x(N-1),两两计算,互除,除到结果为1,即x1=x2,此时幂次为0,结果为1。
把分子分母分别去算,结果是相同的因为,分子分母的幂次是相同的


#include<iostream>
#include<algorithm>using namespace std;const int N = 110;typedef long long ll;ll x[N], a[N], b[N];
int cnt = 0;ll gcd(ll a, ll b)
{return b ? gcd(b, a % b) : a;
}ll gcd_sub(ll a, ll b)
{if(a < b) swap(a, b);//更相减损术总是大减小 if(b == 1) return a;return gcd_sub(b, a / b);
}int main()
{int n;cin >> n;for(int i = 0; i < n; i ++) cin >> x[i];sort(x, x + n);for(int i = 1; i < n; i ++){if(x[i] != x[i - 1]){ll d = gcd(x[i], x[0]);a[cnt] = x[i] / d;//分子b[cnt] = x[0] / d;//分母cnt ++; }}ll up = a[0], down = b[0];for(int i = 1; i < cnt; i ++){up = gcd_sub(up, a[i]);//求最大公约数down = gcd_sub(down, b[i]); }cout << up << "/" << down << endl;return 0;
}

acwing 1223.最大比例(更相减损术)相关推荐

  1. 最大比例【更相减损术】

    最大比例 题意 给出一个等比数列中的几项,求出符合这几项的最大等比值. 思路 这几项排序.去重之后,按照通项公式写出来,第i个数 :第一个数 = r^k. 其中r为一个比例,其gcd(分子,分母)= ...

  2. 初等数论--整除--欧几里得算法/辗转相除法/更相减损术

    初等数论--整除--欧几里得算法/辗转相除法/更相减损术 欧几里得算法/辗转相除法/更相减损术 博主本人是初学初等数论(整除+同余+原根),本意是想整理一些较难理解的定理.算法,加深记忆也方便日后查找 ...

  3. 五十六、从高中碾转相除法、更相减损术算法谈起

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题代码化. ---- Runsen 先问你们一个小学问题:如何求两个整数的最大公约数? 曾经见过不少的算法题 ...

  4. jzoj3793,P2090-数字对【更相减损术,欧几里得算法,数论】

    正题 题目链接: https://www.luogu.org/problemnew/show/P2090 大意 一个数对(a,b),每次可以变为(a+b,b)或(a,a+b).然后要求一个数对中有n求 ...

  5. 《九章算术》中更相减损术----求最大公约数

    更相减损法:也叫更相减损术,是出自<九章算术>的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合. #include<stdio.h> in ...

  6. Python使用更相减损术计算两个整数的最大公约数

    更相减损术是<九章算术>中给出的一种用于约分的方法,也可以用来计算最大公约数,其步骤为: 1)如果两个整数都是偶数,就使用2约简,直到两个整数不再都是偶数,然后执行第2步.如果两个整数不都 ...

  7. 【原创】更相减损术 stein算法 欧几里得算法 拓展欧几里得算法 扩展欧几里得算法 逆元的计算与筛法 解模线性方程

    欧几里得 说在前面 数论学复习 Part 6. 然后再来一章CRT和组合数,就飞往概率,以此为跳板去向DP. 计划很美啊你. P.S. 这么说来拉格朗日插值可以说是数论学复习的Part 0了啊. 有一 ...

  8. 更相减损术--最大公约数

    题目: 更相减损术 ,哈哈,我们今天来看一道稍微复杂一点的题嘛,这是选自codeforce上的一道题,好了,我们一起来看看题意吧: 题目描述是复制的,可能有部分显示不对,我就把题目链接放下面! 题目链 ...

  9. C++算法:辗转相除法与更相减损术

    辗转相除法与更相减损术 1.我们已经学过求最大公因数的知识,你能求出18与30的公因数吗? 2.如果公因数比较大而且根据我们的观察又不能得到一些公因数,我们又应该怎样求它们的最大公因数?比如求8251 ...

最新文章

  1. anaconda安装yolov3_YOLOv3_图像识别_神经网络_人工智能
  2. 单片机c语言实验,单片机实验C语言编程.doc
  3. 134.加油站(javascript)
  4. scp(安全副本)到ec2实例,无需密码
  5. drools规则引擎 java_Drools规则引擎的使用总结
  6. 在浏览器中进行深度学习:TensorFlow.js (二)第一个模型,线性回归
  7. 为何恒星/太阳(辐射)可以被视为黑体(辐射)?
  8. 计算机软件服务的财务制度,餐饮业财务管理制度流程
  9. 计算2的N次方(C++)
  10. android打开iso,安卓手机端如何运行iso镜像文件
  11. 厉害,超乎想象,鹅厂程序员占比近 7 成
  12. css 实现对话气泡
  13. echarts实现甘特图
  14. CAD版本转换怎么转?
  15. 2020暑期实习 总结
  16. 几何画板 linux,用几何画板怎么作函数图像
  17. 笔记:云相关基础知识
  18. C++、PHP、Java、Python学哪个好?如何才能少走弯路
  19. py附带协议头post上传图片
  20. pdf怎么压缩得小一点?软件压缩更高效

热门文章

  1. 我的世界javamod怎么装_怎么安装我的世界jav?
  2. Unity之ASE实现炫酷控边溶解
  3. 网站建设之优质软文“赢”销不可或缺
  4. STM32驱动TEA5767收音机模块
  5. 第四届“蓝桥杯”全国软件专业人才设计与创业大赛选拔赛C/C++本科A组(题目及代码)
  6. 利用FFmpeg转码生成MP4文件
  7. N76E003_BSP最新例程、驱动下载【官方网址】
  8. flutter如何实现删除线效果
  9. 如何解决github安装失败
  10. gRPC(1)- gRPC 简介