关于埃及分数 NC50246

这里我的代码是:

#include<bits/stdc++.h>
#define int long long
#define I using
#define AK namespace
#define NOIP std
I AK NOIP;
int depth;
const int N=15;
int path[N],ans[N];
inline int gg(int a,int b){
	if(!b) return a;
	else return gg(b,a%b);
}
bool dfs(int a,int b,int dep){
	int l=max(b/a,path[dep-1]+1);
	int r=(depth-dep+1)*b/a;
	if(ans[depth]) r=min(ans[depth]-1,r);
	bool flag=false;
	if((depth-dep+1)*b<a*l) return false;
	if(dep>depth) return false;
	if(a==1 && b>path[dep-1]){
		path[dep]=b;
		if(b<ans[depth] || !ans[depth]){
			for(int i=1;i<=depth;i++) ans[i]=path[i];
		}
		return true;
	}
	for(int i=l;i<r;i++){
		path[dep]=i;
		int ta=a*i-b,tb=b*i;
		int c=gg(ta,tb);
		if(dfs(ta/c,tb/c,dep+1)) flag=true;
	}
	return flag;
}
signed main(){
	int a,b;
    scanf("%lld %lld",&a,&b);
	int c=gg(a,b);
    a/=c,b/=c;
	while(!dfs(a,b,1)) depth++;
	for(int i=1;i<=depth;i++) printf("%lld ",ans[i]);
	return 0;
}

但是这一份代码是有问题的,在输入数据

570 877

时,正确输出是

2 7 144 15786 18417 42096

这份代码的dfs在执行时显然会死循环,这种情况还有很多(不是卡常!

但是AC了

所以求助大佬们如何AC所有可能出现且符合题目要求的情况

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务