关于埃及分数 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所有可能出现且符合题目要求的情况