题解:
给你2个数n,m,n每次都能乘以它的一个因子成为新的n,问你n至少乘多少次能够变成m,如果不能的话就输出-1。
如果n能变成m话,m肯定是n的整数倍,初始的n乘以多个因子变成m,那么那些因子的乘积就是m/n,也就是n*(m/n)=m,所以每次都找到k=gcd(n,m/n),然后n=n*k,(m/n)=(m/n)/k,直到n=m。
如果k=1的话,n也不能变成m.这题的坑点就是1<=m<=2^63,要用无符号长整型来表示。
不管是long long,还是__int64都是不够大的,因为它们所能表示的最大值为263-1,
代码:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;
unsigned long long gcd(unsigned long long a,unsigned long long b)
{
return b?gcd(b,a%b):a;
}
int main()
{
int t,ans,k;
unsigned long long int m,n;
cin>>t;
while(t--)
{
ans=0;
cin>>n>>m;
while(n!=m)
{
if(n>m||(m%n!=0))
{
printf("-1\n");
break;
}
k=gcd(m/n,n);
if(k==1)
{
printf("-1\n");
break;
}
n*=k;
ans++;
}
if(n==m)
{
printf("%d\n",ans);
}
}
}