博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Loj10022 埃及分数(迭代加深搜索IDDFS)
阅读量:6235 次
发布时间:2019-06-22

本文共 1280 字,大约阅读时间需要 4 分钟。

#include
#include
#include
using namespace std;typedef long long ll;ll depth,a,b,flag,ans[100005],nans[100005];inline ll gcd(ll a,ll b){ return b?gcd(b,a%b):a; }inline void yuefen(ll &a,ll &b){ll eaa=gcd(a,b);a/=eaa;b/=eaa;}inline void dfs(ll now,ll shen_fz,ll shen_fm,ll last_fm){ yuefen(shen_fz,shen_fm);//在上面统一约分多省事啊哈哈哈 if(now==depth){ if(shen_fz==1&&shen_fm>last_fm){ if(flag&&shen_fm>=ans[depth])return;//要比较取优,因为最大的分母是算出来的不是搜出来的 nans[depth]=shen_fm; flag=1; memcpy(ans,nans,sizeof(nans)); } return; } for(ll i=last_fm+1;i<=ceil((double)(depth-now+1)*shen_fm/shen_fz);i++){ //i=last_fm+1使搜出来的分母递增,所以说都是要这样搜啊QAQ //(depth-now+1)*shen_fm/shen_fz是趋近的最大值,即限制能否在depth内把shen的分数拆分完 //其实好像可以判断一下就是(i>=shen_fm/shen_fz才可以),跟最后一个注释同理,亲测确实快一点 nans[now]=i; dfs(now+1,shen_fz*i-shen_fm,shen_fm*i,i); }}int main(){ scanf("%I64d%I64d",&a,&b);//好吧其实在loj上忘了改成lld while(++depth){ dfs(1,a,b,b/a-1);//b/a是第一个分母的最小值,第一个分母不用从1开始搜的 if(flag){ for(ll i=1;i<=depth;i++)printf("%I64d ",ans[i]); return 0; } }}

好吧算是比较易懂了

参考文献:

转载于:https://www.cnblogs.com/Y15BeTa/p/loj10022.html

你可能感兴趣的文章
selenium鼠标操作及下拉框的操作
查看>>
ethereumjs/merkle-patricia-tree-1-简介
查看>>
记录前端工作中用的一些常用的函数(二)
查看>>
iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建...
查看>>
iOS开发——高级技术&调用地图功能的实现
查看>>
关于mail mailx 以及sendmail 的理解
查看>>
解决 由于本机的限制,该操作已被取消。请与系统管理员联系
查看>>
团队-及格成绩查询系统-模块测试过程
查看>>
[日记]夜滑
查看>>
详解 CSS 绝对定位
查看>>
[高数][高昆轮][高等数学上][第一章-函数与极限]04.无穷小与无穷大
查看>>
委托转换,委托重载
查看>>
基于Java反射的map自动装配JavaBean工具类设计
查看>>
不同网络层的协议与工具
查看>>
sass,compass让开发效率飞起
查看>>
mac效率工具
查看>>
unity 发布.exe的相关设置
查看>>
android icon设计规则
查看>>
Excel 返回第2大的值
查看>>
1576 最长严格上升子序列
查看>>