<aside> 💡
나올 수 있는 수를 정점으로 생각하여 BFS
이때 최단거리로 $k$에 도달한 횟수도 저장해야한다.
</aside>
#include <bits/stdc++.h>
#define FASTIO ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
using namespace std;
typedef long long ll;
int n, k;
bool v[250'001];
int cnt[250'001];
int dist[250'001];
int ans = -1;
signed main()
{
FASTIO;
cin >> n >> k;
memset(dist, 0x7f, sizeof dist);
queue<pair<int, int>> q;
q.push({n, 0});
v[n] = true;
dist[n] = 0;
cnt[n] = 1;
while(!q.empty()){
auto[cur, d] = q.front();
q.pop();
int mn = cur-1;
int pl = cur+1;
int ml = 2*cur;
if(mn>=0){
if(!v[mn]){
v[mn] = true;
dist[mn] = d+1;
q.push({mn, dist[mn]});
}
if(dist[mn] == d+1){
cnt[mn]+=cnt[cur];
}
}
if(pl<250'000){
if(!v[pl]){
v[pl] = true;
dist[pl] = d+1;
q.push({pl, dist[pl]});
}
if(dist[pl] == d+1){
cnt[pl]+=cnt[cur];
}
}
if(ml<250'000){
if(!v[ml]){
v[ml] = true;
dist[ml] = d+1;
q.push({ml, dist[ml]});
}
if(dist[ml] == d+1){
cnt[ml]+=cnt[cur];
}
}
}
cout << dist[k] <<"\\n";
cout << cnt[k] << "\\n";
return 0;
}