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. 输入: 输入一个真分数, ...
随机推荐
- Java Swing 如何让窗体居中显示
如题,其他不多说,直接上代码! package com.himarking.tool; import java.awt.Toolkit; import javax.swing.JFrame; @Sup ...
- Access restriction required library rt.jar
在JAVA项目开发中,使用到了BASE64Decoder,但编辑运行时却会出现以下错误:Access restriction required library rt.jar,这里就详细的说明一下如何解 ...
- 0016_练习题d2
__author__ = 'qq593' #!/usr/bin/env python #-*- coding:utf-8 -*- #元素分类,有如下值集合[11,22,33,44,55,66,77,8 ...
- 环境变量,include搜索路径,lib库搜索路径
环境变量 系统环境变量 我们知道,我们经常要设置一些环境变量,系统环境变量我们非常容易理解.其实我们在windows中经常容易接触.其实环境变量是一个非常广泛的一个概念,它与web应用程序中的web. ...
- mt_rand()函数、str_shuffle() 函数、join() 函数
mt_rand() 使用 Mersenne Twister 算法返回随机整数. 语法 mt_rand(min,max) 定义和用法 str_shuffle() 函数随机地打乱字符串中的所有字符. 语法 ...
- Struts2框架05 result标签的类型、拦截器
1 result标签是干什么的 就是结果,服务器处理完返回给浏览器的结果:是一个输出结果数据的组件 2 什么时候需要指定result标签的类型 把要输出的结果数据按照我们指定的数据类型进行处理 3 常 ...
- oracle获取列的备注和数据类型
select column_name, data_type, data_precision, data_scale, nvl((select t_s.comments from all_col_com ...
- windows平台下用C#访问HBase
Hadoop中的HBase有多种数据访问方式,ubuntu里可以用hbase shell查看操作hbase数据库,但windows平台下需要用thrift对它进行访问. 例如hadoop安装在/usr ...
- java全栈day12----final static 匿名对象 内部类 包的声明与访问
final关键字概念 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承, 或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后, ...
- PreparedStatement预编译对象实现
模糊查询 插入 同时插入两行数据 执行更新语句 删除操作