可能是重载减号的时候出了负数吧。。
求助dalao
//P1763 埃及分数
#include <bits/stdc++.h>
using namespace std;
#define ll long long
struct frac{
int up;int down;//a/b
frac():up(),down(){}
frac(int x,int y):up(x),down(y){}
void init(int x,int y){
up=x;down=y;
}
void p()
{
printf("%d/%d\n",up,down);
}
}now;
ll cnt[11],ans[11],flag,dep;
ll gcd(ll a,ll b)
{
if(b==0)return a;
else return gcd(b,a%b);
}
void pushup(frac &a)//化简分数
{
int x=a.up,y=a.down;
int mid=gcd(x,y);
a.up=x/mid;
a.down=y/mid;
}
frac operator-(frac a,frac b)
{
ll down = a.down*b.down;
ll up = a.up*b.down - b.up*a.down;//可能是这里出负数了。
frac ret(up,down);
pushup(ret);
//ret.p();
return ret;
}
void dfs(frac now,int c)
{
if(c>dep)return;
if(now.up==1&&now.down>cnt[c-1])
{
cnt[c]=now.down;
if(!flag||cnt[c]<ans[c])
for(int i=1;i<=c;i++)ans[i]=cnt[i];
flag=1;
return;
}
ll a=now.up,b=now.down;
ll l=max(b/a,cnt[c-1]+1);
ll r=(dep-c+1)*b/a;
if(flag&&r>=ans[dep])r=ans[dep]-1;
for(ll i=l;i<=r;i++)
{
cnt[c]=i;
frac mid(1,i);
dfs(now-mid,c+1);
}
}
int main()
{
int a,b;cin>>a>>b;
now.init(a,b);
for(dep=1;dep<=10;++dep)
{
dfs(now,1);
if(flag)
{
for(int i=1;i<=dep;i++)
printf("%lld ",ans[i]);
return 0;
}
}
}