给出两个数N和M。 N每次可以乘上一个自己的因数变成新的N。 求最初的N到M至少需要几步。 如果永远也到不了输出−1。
输入描述
第一行读入一个数T表示数据组数。 接下来T行,每行两个数N和M。 T≤1000, 1≤N≤1000000,1≤M≤263. 注意M的范围。hack时建议输出最后一行的行末回车;每一行的结尾不要输出空格。
输出描述
对于每组数据,输出一个数表示答案。
输入样例
3 1 1 1 2 2 4
输出样例
0 -1 1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
typedef unsigned long long ll;
int main()
{
int t,i,j,ans,ok,temp;
ll n,m;
cin>>t;
while(t--) {
ok=0;
ans=0;
map<int,int>a;
map<int,int>b;
cin>>n>>m;
if(n>m) {
cout<<"-1"<<endl;
continue;
}
for(i=2;i*i<=n;i++){
while(n%i==0) {
++a[i];
n/=i;
}
}
if(n!=1) a[n]=1;
for(i=2;(ll)i*i<=m;i++){
if(m%i==0) {
temp=0;
while(m%i==0) {
++b[i];
m/=i;
}
if(a[i]==0 || a[i]>b[i]) {
ok=1;
break;
}
while(a[i]<b[i]) {
a[i]=a[i]*2;
temp++;
}
ans=max(ans,temp);
}
}
if(m!=1) {
b[m]=1;
if(a[m]==0 || a[m]>b[m]) {
ok=1;
}
}
if(ok) cout<<"-1"<<endl;
else cout<<ans<<endl;
}
return 0;
}