埃及分数
时间:2019-09-30
本文章向大家介绍埃及分数,主要包括埃及分数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目描述
对于形如1/n (n为正整数)称为单位分数,给出a和b,求最少可用几个单位分数表示,给出方案。
思路
这道题的难点主要在于对分数的处理和枚举边界的决定。首先我们先可以确定dfs的大致框架和dfs的内容。由于一个分数有无数多种拆分方式,而我们需要的仅仅是长度最短和最小分数最大的方案,因此可以采用迭代加深搜索,枚举这个分数由几个单位分数组成。所以我们的dfs需要存储这几个信息:当前枚举到第几个答案,枚举的下界,用p和q两个变量存储分数。我们先考虑最初的枚举下界,显然,如果a|b,那么可直接输出答案;否则,我们可以从a/b+1开始枚举,因为这是小于它的最大单位分数。所以我们可以每一次都处理一遍p/q的下界,枚举每个单位分数,再减去该单位分数进行枚举。不过我们还未处理其上界,显然,如果剩下的所有数都为1/i和都达不到p/q就可以结束循环。
代码
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll s[10100],ans[10100],lim; ll gcd(ll a,ll b) { return a%b==0?b:gcd(b,a%b); } bool check() { /* for(ll i=lim;i>0;i--) printf("%lld ",s[i]); printf("\n");*/ for(ll i=lim;i>0;i--) if(s[i]!=ans[i])return ans[i]==-1||s[i]<ans[i]; return 0; } bool dfs(ll dep,ll from,ll p,ll q) { if(dep==lim) { if(q%p!=0)return 0; s[dep]=q/p; if(check()) { for(int i=1;i<=dep;i++) ans[i]=s[i]; } return 1; } else { bool f=0; from=max(from,q/p+1); for(ll i=from;;i++) { if(q*(lim+1-dep)<=i*p)break ; s[dep]=i; ll pp=p*i-q; ll qq=q*i; ll g=gcd(pp,qq); if(dfs(dep+1,i+1,pp/g,qq/g))f=1; } return f; } } int main() { ll a,b; scanf("%lld%lld",&a,&b); if(b%a==0) printf("%lld",b/a); else { for(lim=1;;lim++) { memset(ans,-1,sizeof(ans)); if(dfs(1,b/a+1,a,b))break ; } for(ll i=1;i<=lim;i++) printf("%lld ",ans[i]); } return 0; }
原文地址:https://www.cnblogs.com/fangbozhen/p/11613047.html
- 剑指OFFER之重建二叉树(九度OJ1385)
- 记录visual Studio使用过程中的两个问题
- 剑指OFFER之二维数组中的查找(九度OJ1384)
- Python标准库02 时间与日期 (time, datetime包)
- PR&AE插件开发遇到的一个坑
- 一个简单的inno setup模板
- Python标准库——走马观花
- 共享栈
- inno setup读取注册表遇到的一个坑
- Python标准库的学习准备
- Python小题目 针对快速教程
- [Oracle入门级]知识概况
- Space Nation 创始人卡尔•瓦哈加可拉:AI为人类探索太空提供了更多可能
- Final Cut Pro X效果插件开发总结
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [::-1] 数组中元素反向
- MySQL面试题
- numpy~运算符和Boolean类型变量
- PHP安全基础第一章
- 21 个非常有用的 .htaccess 提示和技巧
- PHP实现图片马赛克效果
- PHP中的类
- PHP获取表单textarea数据中的换行问题
- Numpy根据Bool值挑选数组中元素
- MySQL获取每个分类下面的前三条数据
- windows宿主机如何SSH连接VMware的Linux虚拟机
- np.random.rand均匀分布随机数和np.random.randn正态分布随机数函数使用方法
- Java FileReader使用相对路径读取文件
- MySQL批量插入数据库实现语句性能分析
- np.repeat用法