最后一个点wa求助
查看原帖
最后一个点wa求助
457002
szhl0803楼主2022/9/3 20:09

可能是重载减号的时候出了负数吧。。

求助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;
		}
	}
 } 
2022/9/3 20:09
加载中...