传送门

题目大意

给出一个真分数 a/b,要求出几个互不相同的埃及分数(从大到小),使得它们之和为 a/b

(埃及分数意思是分子为1的分数,详见百度百科

如果有多组解,则分数数量少的优先

如果分数数量一样则分母最大的要尽量小,如果最大的分母同样大,则第二大的分母尽量小,以此类推

为了加大难度,会给出k个不能作为分母的数

(2<=a,b<=876,k<=5 并且 a,b 互质)

首先想的是数论,但是呢

推不出来...

然后发现a,b好像不大

貌似可以搜索

但是呢

不知道上界...

那就迭代加深搜索呗

然后想想怎么剪枝

如果知道 a/b,要怎么求出最小 k 使 1/k < a/b 呢(注意符号)

易知 a/b 为真分数 ,a,b,k均为整数
所以 a<b
所以必定有整数 x,y 使得 x*a+y=b 且y<a
所以可得 int(b/a)=int( (x*a+y) /a )=int(x*a/a)+int(y/a) = x
因为 int(b/a)<=b/a,int(b/a)=x
所以 x+ > b/a , 所以 int(b/a)+1>b/a,
所以1/(x+) < a/b 又 /int(b/a)=/x >=a/b 所以 x+1就是最小的 k 使得 /k < a/b 所以 k=int(b/a) +  证明完毕

知道了 k 的下界,那还要求 k 的上界

显然每次求的分母肯定要比上一次大(题目要求)

所以如果后面所有的分母都为 k ,加起来还没有当前要求的数大,那就不要再搜下去了,再下去也不会有结果的

然后就可以搜了,至于判断是否可用我用的是set

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<set>
using namespace std;
const int N=1e5+;
set <long long> p;
long long t,A,B,n,mxdep;
long long ans[N],w[N];
bool flag;
inline long long gcd(long long a,long long b)
{
return b ? gcd(b,a%b) : a;
}//gcd是为了约分
inline bool pd()
{
for(int i=mxdep;i;i--)
if(ans[i]!=w[i])
return ans[i]&&ans[i]<w[i];
return ;
}//判断答案是否更优
inline void dfs(long long dep,long long a,long long b,long long mi)
{
if(dep==mxdep)
{
if(b%a||(b<(mi-)*a+)||p.count(b/a)) return;//判断合法性
//如果a/b可化为 1/k 的形式并且 1/k 可以选
w[dep]=b/a;
if(pd()) return;//判断答案是否更优
memcpy(ans,w,sizeof(w)); flag=;//更新
return;
}
mi=max(mi,b/a+);//求出下界
for(long long i=mi;i;i++)
{
if( (mxdep-dep+)*b<=i*a ) return;//上界
if(p.count(i)) continue;//判断合法
w[dep]=i;//记录路径
long long xa=a*i-b,xb=i*b;//通分
long long z=gcd(xa,xb);
dfs(dep+,xa/z,xb/z,i+);//约分,向下一层
}
}
int main()
{
cin>>t;
for(long long i=;i<=t;i++)
{
flag=; mxdep=;
cin>>A>>B>>n;
long long c;
p.clear();//细节
while(n--) scanf("%lld",&c),p.insert(c);//存储不合法的数
while(mxdep++)
{
memset(ans,,sizeof(ans));
dfs(,A,B,B/A+);
if(flag) break;
}//迭代加深
printf("Case %lld: %lld/%lld=1/%lld",i,A,B,ans[]);
for(int i=;i<=mxdep;i++)
printf("+1/%lld",ans[i]);
printf("\n");
}
return ;
}

UVA12558 Egyptian Fractions (HARD version)(埃及分数)的更多相关文章

  1. UVA12558 Egyptian Fractions (HARD version) (埃及分数,迭代加深搜索)

    UVA12558 Egyptian Fractions (HARD version) 题解 迭代加深搜索,适用于无上界的搜索.每次在一个限定范围中搜索,如果无解再进一步扩大查找范围. 本题中没有分数个 ...

  2. uva12558 Egyptian Fractions (HARD version)(迭代深搜)

    Egyptian Fractions (HARD version) 题解:迭代深搜模板题,因为最小个数,以此为乐观估价函数来迭代深搜,就可以了. #include<cstdio> #inc ...

  3. UVA-12558 Egyptian Fractions (HARD version) (IDA* 或 迭代加深搜索)

    题目大意:经典的埃及分数问题. 代码如下: # include<iostream> # include<cstdio> # include<cstring> # i ...

  4. UVa 12558 - Egyptian Fractions (HARD version)

    题目大意: 给出一个真分数,把它分解成最少的埃及分数的和.同时给出了k个数,不能作为分母出现,要求解的最小的分数的分母尽量大. 分析: 迭代加深搜索,求埃及分数的基础上,加上禁用限制就可以了.具体可以 ...

  5. 【习题 7-7 UVA-12558】Egyptian Fractions (HARD version)

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 迭代加深搜索. 枚举最大量maxdep 在dfs里面传剩余的要凑的分子.分母 以及上一次枚举的值是多少. 然后找到最小的k,满足1/ ...

  6. 【Uva 12558】 Egyptian Fractions (HARD version) (迭代加深搜,IDA*)

    IDA* 就是iterative deepening(迭代深搜)+A*(启发式搜索) 启发式搜索就是设计估价函数进行的搜索(可以减很多枝哦~) 这题... 理论上可以回溯,但是解答树非常恐怖,深度没有 ...

  7. UVA_埃及分数(Hard Version) UVA 12588

    Problem EEg[y]ptian Fractions (HARD version)Given a fraction a/b, write it as a sum of different Egy ...

  8. UVA12558-Efyptian Fractions(HARD version)(迭代加深搜索)

    Problem UVA12558-Efyptian Fractions(HARD version) Accept:187  Submit:3183 Time Limit: 3000 mSec  Pro ...

  9. 华为OJ平台——将真分数分解为埃及分数

    题目描述: 分子为1的分数称为埃及分数.现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数.如:8/11 = 1/2+1/5+1/55+1/110. 输入: 输入一个真分数, ...

随机推荐

  1. IE9以及IE9以下,无法执行innerHTML这一操作的解决方法

    例如:在select下无法用innerHTML添加<option> 解决代码: var s=document.createElement("option"); s.te ...

  2. OpenCV 官方工程报错(1) Couldn't load mixed_sample from loader

    openCV/OpenCV-android-sdk/samples/tutorial-2-mixedprocessing 工程 - ::): Trying to get library list - ...

  3. ActionBarActivity的使用注意事项

    1.调用getActionbar()方法返回为空的解决方法 此activity是设计来支持低版本系统用actionbar的,低版本没有getActionbar() 需要使用 getSupportAct ...

  4. 【总结整理】js获取css的属性(内部,外部,内嵌(写在tag中))

    在JS中需要获取某个元素的宽高或者是绝对定位的位置信息,通常我们会这么写: var elemWidth = elem.style.width; console.log(elemWidth); //(空 ...

  5. koa2 原生链接mysql

    1.安装mysql $ npm install mysql 2.代码示例: const mysql = require("mysql"); // mysql.Promise = g ...

  6. 华为JAVA机试流程

    1.JAVA机试流程:①打开IE浏览器,输入机试系统IP地址(以当天告知的地址为准):②输入姓名.手机,选择“C/C++”或“JAVA”,登录:③登录后显示题目,阅读题目并点击页面最下方的“下载框架文 ...

  7. iOS Simulator hang up ( Xcode4.6.3)

    最近遇见个Xcode的bug,搞的十分郁闷. 具体现象是:程序前段时间都是好好的,可以运行,第二天开机,调试就无法进入模拟器.就连main()函数都进不了.模拟器完全挂起了.具体说来就是代码一句都没改 ...

  8. spring项目中监听器作用-ContextLoaderListener

    附加链接:http://blog.csdn.net/zjw10wei321/article/details/40145241 作用:在启动Web 容器时,自动装配Spring applicationC ...

  9. a标签空的情况下 IE6 IE7下点击无效

    如果给空a标签定义了宽度和高度且使用了absolute,则在IE6和IE7中点击无效. 两种解决方法(主要是针对a标签不能设置背景情况):         1.给a标签添加样式:background: ...

  10. 数据结构_相似三角形优雅值_sjx

    问题描述 给你 n 个三角形,每个三角形有一个优雅值,然后给出一个询问,每次询问一个三角形,求与询问的三角形,相似的三角形中的优雅值最大是多少. ★数据输入第一行输入包括 n 一个数字,接下来 n 行 ...