代码大意为:一个数要经过几步变为另一个数;
内部题目,具体不能多说,自己无聊写的。
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
int n,m;
int visti[10005];
vector <int> divisor(int n) {
vector <int> res;
for(int i=2; i*i<=n; i++) {
if(n%i==0) {
res.push_back(i);
if(i!=n/i) res.push_back(n/i);
}
}
return res;
}
vector <int> divi;
int ans;
int bfs() {
priority_queue<int> que;
que.push(n);
visti[n]=1;
int flag=0;
while(!que.empty()) {
int x=que.top();
que.pop();
ans++;
divi=divisor(x);
for(int i=0; i<(int)divi.size(); i++) {
int newn=x+divi[i];
if(visti[newn]) continue;
if(newn<m) {
que.push(newn);
} else if(newn==m) {
ans++;
flag=1;
break;
}
}
if(flag) break;
}
if(flag==0 && n!=m) ans=-1;
else if(flag==0 && n==m) ans=0;
return ans;
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&m);
memset(visti,0,sizeof(visti));
ans=-1;
int a=bfs();
printf("%d\n",a);
}
}