【问题描述】
在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数。如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的。对于一个分数a/b,表示方法有很多种,但是哪种最好呢?首先,加数少的比加数多的好;其次,加数个数相同的,最小的分数越大越好;再次,满足上述条件的,字典序最小的最好。
如:
19/45=1/3 + 1/12 + 1/180
19/45=1/3 + 1/15 + 1/45
19/45=1/3 + 1/18 + 1/30
19/45=1/4 + 1/6 + 1/180
19/45=1/5 + 1/6 + 1/18
最好的是最后一种,因为1/18比1/180,1/45,1/30,1/180都大。
给出a,b(0
program asdf;
var
t:boolean;
ans,a:array[0..10000] of int64;
i,s:longint;
big,fz,fm,x,y:int64;
function max(a,b:longint):longint;
begin
max:=a;
if max<b then max:=b;
end;
function min(a,b:longint):longint;
begin
min:=a;
if min>b then min:=b;
end;
procedure sss(k:longint);
var
i:longint;
mmi,mma,sx,sy:int64;
begin
mmi:=max(a[k-1]+1,y div x);
mma:=min(big-1,y*(s-k+1) div x);
sx:=x;
sy:=y;
for i:=mmi to mma do
begin
x:=sx;
y:=sy;
x:=x*i-y;
if x<0 then
continue;
y:=y*i;
a[k]:=i;
if k<>s then
sss(k+1)
else if (x=0)and(i<=big) then
begin
ans:=a;
big:=i;
t:=true;
end;
end;
end;
begin
read(fz,fm);
s:=0;
big:=999999999;
t:=false;
while not t do
begin
inc(s);
x:=fz;
y:=fm;
sss(1);
if s>20 then
break;
end;
for i:=1 to s do
write(ans[i],' ');
writeln;
end.