分析:给你2个数n,m,n每次都能乘以他的一个因子成为新的n,问你n至少乘多少次能够变成m,如果不能的话就输出-1。如果n能变成m话,m肯定是n的整数倍,初始的n乘以多个因子变成m,那么那些因子的乘积就是m/n,也就是n*(m/n)=m,所以每次都找到d=Gcd(n,m/n),然后n'=n*d,(m/n)'=(m/n)/d,直到n=m。如果d=1的话,n也不能变成m.这题的坑点就是1<=m<=2^63,要用无符号长整型来表示。
# include <stdio.h>
unsigned long long Gcd(unsigned long long a,unsigned long long b)
{
return b?Gcd(b,a%b):a;
}
int main()
{
int t,ans;
unsigned long long n,m,d;
scanf("%d",&t);
while(t--)
{
scanf("%I64u%I64u",&n,&m);
if(n==m)
{
printf("0\n");
continue;
}
if(m%n!=0)
{
printf("-1\n");
continue;
}
m=m/n; ans=0;
while(m!=1)
{
d=Gcd(n,m);
n=n*d;
m=m/d;
ans++;
if(d==1)
break;
}
if(m!=1)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}