UVA12558 Egyptian Fractions (HARD version)(埃及分数)
题目大意
给出一个真分数 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)(埃及分数)的更多相关文章
- UVA12558 Egyptian Fractions (HARD version) (埃及分数,迭代加深搜索)
UVA12558 Egyptian Fractions (HARD version) 题解 迭代加深搜索,适用于无上界的搜索.每次在一个限定范围中搜索,如果无解再进一步扩大查找范围. 本题中没有分数个 ...
- uva12558 Egyptian Fractions (HARD version)(迭代深搜)
Egyptian Fractions (HARD version) 题解:迭代深搜模板题,因为最小个数,以此为乐观估价函数来迭代深搜,就可以了. #include<cstdio> #inc ...
- UVA-12558 Egyptian Fractions (HARD version) (IDA* 或 迭代加深搜索)
题目大意:经典的埃及分数问题. 代码如下: # include<iostream> # include<cstdio> # include<cstring> # i ...
- UVa 12558 - Egyptian Fractions (HARD version)
题目大意: 给出一个真分数,把它分解成最少的埃及分数的和.同时给出了k个数,不能作为分母出现,要求解的最小的分数的分母尽量大. 分析: 迭代加深搜索,求埃及分数的基础上,加上禁用限制就可以了.具体可以 ...
- 【习题 7-7 UVA-12558】Egyptian Fractions (HARD version)
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 迭代加深搜索. 枚举最大量maxdep 在dfs里面传剩余的要凑的分子.分母 以及上一次枚举的值是多少. 然后找到最小的k,满足1/ ...
- 【Uva 12558】 Egyptian Fractions (HARD version) (迭代加深搜,IDA*)
IDA* 就是iterative deepening(迭代深搜)+A*(启发式搜索) 启发式搜索就是设计估价函数进行的搜索(可以减很多枝哦~) 这题... 理论上可以回溯,但是解答树非常恐怖,深度没有 ...
- 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 ...
- UVA12558-Efyptian Fractions(HARD version)(迭代加深搜索)
Problem UVA12558-Efyptian Fractions(HARD version) Accept:187 Submit:3183 Time Limit: 3000 mSec Pro ...
- 华为OJ平台——将真分数分解为埃及分数
题目描述: 分子为1的分数称为埃及分数.现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数.如:8/11 = 1/2+1/5+1/55+1/110. 输入: 输入一个真分数, ...
随机推荐
- 昨天的笔试题, StringBuffer
代码: public static void switchStr(StringBuffer x, StringBuffer y) { x.append(y); System.out.println(& ...
- od命令 查看二进制文件
od命令用于输出文件的八进制.十六进制或其它格式编码的字节,通常用于显示或查看文件中不能直接显示在终端的字符. 以数值进制格式输出:od [选项] 文件 od -d 文件 --十进制输 ...
- Android中pull解析XML文件的简单使用
首先,android中解析XML文件有三种方式,dom,sax,pull 这里先讲pull,稍候会说SAX和DOM pull是一种事件驱动的xml解析方式,不需要解析整个文档,返回的值是数值型,是推荐 ...
- extends与implements
implements一般是实现接口. extends 是继承类. 接口一般是只有方法声明没有定义的, 那么java特别指出实现接口是有道理的,因为继承就有感觉是父类已经实现了方法,而接口恰恰是没有实现 ...
- Codeforces 1137C Museums Tour (强连通分量, DP)
题意和思路看这篇博客就行了:https://www.cnblogs.com/cjyyb/p/10507937.html 有个问题需要注意:对于每个scc,只需要考虑进入这个scc的时间即可,其实和从哪 ...
- HDU 4921 Map(状态压缩)
题意看这篇博客. 思路参考的这篇博客. 补充:面对这种问题有一个常见的套路.比如计算若干个区间对答案的贡献这种问题,直接暴力可能复杂度到O(n ^ 2), 而我们可以计算出每个元素在多少个合法区间中, ...
- docker卸载与安装
sudo apt remove docker.io 报错如下: Reading package lists... Done Building dependency tree Reading state ...
- ARC059F
传送门 分析 见ptx大爷博客 代码 #include<iostream> #include<cstdio> #include<cstring> #include& ...
- ARC073D Simple Knapsack
传送门 题目大意 给你n个物品,你有一个容量为W的背包,每一个物品都有它的重量和价值,让你从n个中选取若干个,使得总重量不超过背包的上限,而且使得价值最大. 分析 首先我们不难发现由于W很大,所以这并 ...
- Spring学习大纲
1.BeanFactory 和 FactoryBean? 2.Spring IOC 的理解,其初始化过程? 3.BeanFactory 和 ApplicationContext? 4.Spring B ...