题目

X星球的某个大奖赛设了M级奖励。每个级别的奖金是一个正整数。
并且,相邻的两个级别间的比例是个固定值。
也就是说:所有级别的奖金数构成了一个等比数列。比如:
16,24,36,54
其等比值为:3/2

现在,我们随机调查了一些获奖者的奖金数。
请你据此推算可能的最大的等比值。

输入格式:
第一行为数字 N (0<N<100),表示接下的一行包含N个正整数
第二行N个正整数Xi(Xi<1 000 000 000 000),用空格分开。每个整数表示调查到的某人的奖金数额

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

测试数据保证了输入格式正确,并且最大比例是存在的。

例如,输入:
3
1250 200 32

程序应该输出:
25/4

再例如,输入:
4
3125 32 32 200

程序应该输出:
5/2

再例如,输入:
3
549755813888 524288 2

程序应该输出:
4/1

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 3000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

代码

#include <stdio.h>
#include <iostream>
#include <vector>
#include <map>using namespace std;
typedef long long LL;
int N;
LL data[100];struct Ratio {LL x, y;Ratio(LL _x, LL _y) : x(_x), y(_y) {LL _gcd = gcd(x, y);x /= _gcd;y /= _gcd;}LL gcd(LL a, LL b) {if (b == 0)return a;return gcd(b, a % b);}
};vector<Ratio> ratios;
map<LL, map<LL,LL> > all_ex;//all_ex[x][pow]==x开pow次方
map<LL, map<LL,LL> > all_log;//all_log[x][y]==log_y_x,y的多少次方是x?
void init(){for (int i = 2; i < 1e6; ++i) {//底数LL cur=(LL)i*i;int pow=2;while(cur<1e12){all_ex[cur][pow]=i;all_log[cur][i]=pow;pow++;cur*=i;}}
}
/*** 对x开pow次方* @param x* @param pow* @return*/
LL extract(LL x,LL pow){if(pow==1)return x;if(x==1)return 1;if(all_ex[x].find(pow)!=all_ex[x].end())//意味着x可以开pow整数次方return all_ex[x][pow];elsereturn -1;
}
/*** 求log_base_x* @param base* @param x* @return*/
LL log(LL base,LL x){if(base==x)return 1;if(all_log[x].find(base)!=all_log[x].end())//意味着可以得打一个k,base的k次方是xreturn all_log[x][base];return -1;
}
int main(int argc, const char *argv[]) {init();freopen("/Users/zhengwei/CLionProjects/lanqiaobei2019/2016_C_A/data10/in8.txt","r",stdin);
//处理输入scanf("%d", &N);for (int i = 0; i < N; ++i) {scanf("%lld", &data[i]);}
//排序sort(data, data + N);//处理只有两项的特殊情况if(N==2){Ratio ans = Ratio(data[1], data[0]);cout << ans.x << "/" << ans.y << endl;return 0;}
//求两两比值,以分数形式存储,vectorfor (int i = 0; i < N - 1; ++i) {if (data[i + 1] != data[i])//去重ratios.push_back(Ratio(data[i + 1], data[i]));}
//对第一个比值开1~..pow(极限为40).次方,作为基数,如果这个基数也是其他比值的基数的话,该基数就是答案for (int pow = 1; pow <= 40; ++pow) {Ratio ra0 = ratios[0];LL x = ra0.x;LL y = ra0.y;LL base_x = extract(x, pow);//对x开pow次方,作为基数,去尝试LL base_y = extract(y, pow);//对y开pow次方,作为基数,去尝试if (base_x == -1 || base_y == -1)continue;//开不出,continue
//        能开:就要去确认所有比值的分子是fx的整数次方,所有比值的分母是fy的整数次方
//计px=getPow(xx,base_x),py=getPow(yy,base_y),要求必须是整数且px==pybool all_match = true;for (int i = 1; i < ratios.size(); ++i) {LL xx = ratios[i].x;LL yy = ratios[i].y;LL log_x = log(base_x,xx);LL log_y = log(base_y,yy);if(base_y==1&&yy==1)log_y=log_x;if (log_x == -1 || log_y == -1 || log_x != log_y) {all_match = false;break;}}if (all_match) {Ratio ans = Ratio(base_x, base_y);cout << ans.x << "/" << ans.y << endl;return 0;}}return 0;
}

征战蓝桥 —— 2016年第七届 —— C/C++A组第10题——最大比例相关推荐

  1. 征战蓝桥 —— 2016年第七届 —— C/C++A组第8题——四平方和

    题目 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 ...

  2. 征战蓝桥 —— 2016年第七届 —— C/C++A组第3题——方格填数

    题目 如下的10个格子 (如果显示有问题,也可以参看[图7-1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻. (左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案 ...

  3. 征战蓝桥 —— 2016年第七届 —— C/C++A组第7题——剪邮票

    剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是 ...

  4. 征战蓝桥 —— 2016年第七届 —— C/C++A组第5题——消除尾一

    题目 下面的代码把一个整数的二进制表示的最右边的连续的1全部变成0 如果最后一位是0,则原数字保持不变. 如果采用代码中的测试数据,应该输出: 0000000000000000000000000110 ...

  5. 征战蓝桥 —— 2016年第七届 —— C/C++A组第2题——生日蜡烛

    题目 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填写他开始过生日party ...

  6. 征战蓝桥 —— 2016年第七届 —— C/C++A组第4题——快速排序

    题目 排序在各种场合经常被用到. 快速排序是十分常用的高效率的算法. 其思想是:先选一个"标尺", 用它把整个队列过一遍筛子, 以保证:其左边的元素都不大于它,其右边的元素都不小于 ...

  7. 征战蓝桥 —— 2015年第六届 —— C/C++A组第10题——灾后重建

    题目 Pear市一共有N(<=50000)个居民点,居民点之间有M(<=200000)条双向道路相连.这些居民点两两之间都可以通过双向道路到达. 这种情况一直持续到最近,一次严重的地震毁坏 ...

  8. 征战蓝桥 —— 2015年第六届 —— C/C++A组第5题——九数组分数

    九数组分数 1,2,3-9 这九个数字组成一个分数,其值恰好为1/3,如何组法? 下面的程序实现了该功能,请填写划线部分缺失的代码. #include <stdio.h>void test ...

  9. 征战蓝桥 —— 2015年第六届 —— C/C++A组第4题——格子中输出

    格子中输出 StringInGrid函数会在一个指定大小的格子中打印指定的字符串. 要求字符串在水平.垂直两个方向上都居中. 如果字符串太长,就截断. 如果不能恰好居中,可以稍稍偏左或者偏上一点. 下 ...

最新文章

  1. while 小项目练习
  2. BZOJ 2793: [Poi2012]Vouchers(调和级数)
  3. 有三AI模拟面试服务上线,一对一服务助你求职
  4. nefu 753 n!末尾有多少个0
  5. C++使用Merge Sort排序计数反转的实现算法(附完整源码)
  6. 除醛重要性美博士环保为您解答!!
  7. C#WebBrowser控件使用教程与技巧收集
  8. codesys raspberry pi_11月7日|Pi第四次减产来袭?4点浅析中文区用户关心的问题
  9. 2021消费者置业信心指数报告
  10. java 连接oracle 进行增删改查
  11. 吴恩达新书AI实战圣经《Machine Learning Yearning》中英文版分享
  12. convex optimization from stanford
  13. 微信二维码名片生成示例【转】
  14. Powershell管理系列(一)Active Direcrtory管理:用户管理
  15. 内容分发网络(CDN)关键技术、架构与应用(一)
  16. spark根据key输出到多个目录
  17. 十大淘宝搜索作弊行为
  18. Java计算同比环比
  19. Frank计算机基础硬件笔记
  20. python 让电脑发出声音代码_python - 代码完成时发出声音警报

热门文章

  1. SpringMVC一例 是否需要重定向
  2. 此地址使用了一个通常用于网络浏览以外的端口。出于安全原因,Firefox 取消了该请求。...
  3. 详解WinCE下USB Host驱动开发(2)
  4. 如何理解pytorch 卷积里group 这个参数
  5. 计算机位数与内存相关,弄懂电脑的各种位数、内存、存储
  6. oenwrt 进不了bios_win7进不了bios原因及解决办法
  7. 单片机定时器实验两位倒计时秒表_单片机学习「1」 初始51单片机
  8. 现代3D图形编程学习-关于本书(译)
  9. [SDOI2013]直径 (树的直径,贪心)
  10. 跳转到页面后加载一个请求的方法