当前位置: 首页 > article >正文

UVa10976 Fractions Again?!(分数拆分)

1、题目

在这里插入图片描述

2、题意

输入正整数 k k k,找到所有正整数 x ≥ y x \ge y xy,使得 1 k = 1 x + 1 y \frac{1}{k} = \frac{1}{x} + \frac{1}{y} k1=x1+y1

3、分析

既然要求找出所有的 x , y x,y x,y,枚举对象自然是 x , y x,y x,y了。可问题在于,枚举的范围如何?从 1 / 12 = 1 / 156 + 1 / 13 1/12 = 1/156 + 1/13 1/12=1/156+1/13 可以看出, x x x 可以比 y y y 大很多。难道要无休止枚举下去?当然不是。由于 x ≤ y x \le y xy,有 1 x ≤ 1 y \frac{1}{x} \le \frac{1}{y} x1y1,因此 1 k − 1 y ≤ 1 y \frac{1}{k} - \frac{1}{y} \le \frac{1}{y} k1y1y1,即 y ≤ 2 k y \le 2k y2k。这样,只需要在 2 k 2k 2k 范围之内枚举 y y y,然后根据 y y y 尝试计算出 x x x 即可。

4、代码实现

#include<cstdio>
#include<vector>
using namespace std;

int main() {
	int k;
  	while(scanf("%d", &k) == 1 && k) {
    vector<int> X, Y;
    for(int y = k+1; y <= k*2; y++) {
      // 1/k = 1/x + 1/y => x = ky/(y-k)
      if(k*y%(y-k) == 0) { 
      	X.push_back(k*y/(y-k)); 
      	Y.push_back(y); 
      }
    }
    printf("%d\n", X.size());
    for(int i = 0; i < X.size(); i++)
      printf("1/%d = 1/%d + 1/%d\n", k, X[i], Y[i]);
  	}
  	return 0;
}

http://www.kler.cn/a/106882.html

相关文章:

  • 试编写算法将单链表就地逆置(默认是带头节 点,如果是不带头节点地逆置呢?)
  • 如何在CentOS 7上搭建SMB服务
  • web实操5——http数据详解,request对象功能
  • web安全测试渗透案例知识点总结(上)——小白入狱
  • ARM架构中断与异常向量表机制解析
  • zabbix搭建钉钉告警流程
  • shell实验
  • Linux常用命令——chpasswd命令
  • 2.19每日一题(分段函数求定积分)
  • MATLAB算法实战应用案例精讲-【目标检测】YOLOV8
  • C++STL----list的使用
  • 解决eslint与prettier在代码格式上的冲突
  • C++系列之list的模拟实现
  • SpringBoot | SpringBoot中实现“微信支付“
  • Flask Run运行机制剖析
  • Kafka - 3.x 副本不完全指北
  • 工业相机常见的工作模式、触发方式
  • linux可用内存不足如何排查清理
  • easyExcel按模板填充数据,处理模板列表合并问题等,并导出为html,pdf,png等格式文件demo
  • github中.gitignore不起作用啦
  • 蓝桥算法赛(铺地板)
  • Linux下复制一个大于1T的文件夹命令
  • 配置Super-VLAN下的DHCP服务器示例
  • Harmony 个人中心(页面交互、跳转、导航、容器组件)
  • Python数据结构——树
  • 如何做到在 5 分钟之内将应用大小减少 60% 的?