题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6726
题解:我们倒着往前找,对于(a,2b-a)->(x,y)那么x+y为偶数,(x, y) 往前的话就是(x, (x+y)/2),所以x和y是渐渐靠拢的,所以max(a,b)<max(x,y) && min(a,b)>min(x,y),这样剪枝就能过了
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
string ans;
ll a,b,c,d;
void dfs(ll x,ll y,string s){
if(x==a&&y==b){
reverse(s.begin(),s.end());
ans=min(ans,s);
return ;
}
if(((x+y)&1)==1||max(a,b)>max(x,y)||min(a,b)<min(x,y)) return ;
dfs(x,(x+y)/2,s+'A');
dfs((x+y)/2,y,s+'B');
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
ans="C";
dfs(c,d,"");
if(ans=="C") puts("No");
else{
puts("Yes");
cout<<ans<<endl;
}
}
return 0;
}