金蛇狂舞
金蛇狂舞
https://ac.nowcoder.com/acm/contest/11219/D
剪枝顺序出问题了 。。。。没想到 对阶乘做限制 学到了ceil floor这两个函数
#include<cmath>
#include<iostream>
using namespace std;
typedef long long ll;
int n;
ll x,y;
long long t,m;
int ans,flag;
ll a[15];
ll jiechen(int k){
ll res =1;
for(int i =1;i<=k;i++)
res*=i;
return res;
}
void dfs(int step,long long k){
if(step >7) {
return;
}
if(k == y){
flag=1;
ans =min(step,ans);
return ;
}
//m=(int)jiechen(k);
if(k<=13)
dfs(step+1,a[k]);
dfs(step+1,ceil(sqrt(k)));
dfs(step+1,floor(sqrt(k)));
}
// void dfs(ll x,int y,int step)
// {
// if(step>7)
// return;
// if(x==y)
// {
// flag = true;
// ans = min(step,ans);
// return;
// }
// dfs(ceil(sqrt(x)),y,step+1);;
// dfs(floor(sqrt(x)),y,step+1);
// if(x<=13)
// dfs(a[x],y,step+1);
// }
int main(){
cin >>n;
for(int i =1;i<=13;i++){
a[i]=jiechen(i);
}
while(n--){
cin >>x >>y;
flag =0;
ans =10;
if(x==y)
{
cout << 0<<endl;
continue;
}
//dfs(x,y,0);
dfs(0,x);
if(flag){
cout<<ans<<endl;
}
else cout<<-1<<endl;
}
return 0;
}