题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5505
题目大意:
给一个数n和m,n能通过乘以自己的因子变到m。问最少需要多少步。
思路:
如果n能到m,那么需要乘上m/n。所以我们第一步就是算出x=gcd(n,m/m)。如果gcd不为1,然后n就变为x*n,此时到m,又需要乘上m/n,但这时的n已经变化了。所以我们就可以这样循环,直到n==m。如果中间过程中gcd变为1,那么表明一定达不到了。
注意一个trick:m可能为2^63,也就是说long long是达不到的,因为long long 的范围是2^63-1。这里要用unsigned long long 。
还有这里直接套用gcd函数即可,自己写的朴素判断会T。
代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#define ll unsigned __int64
using namespace std;
ll vis[1000005];
int main()
{
ll n,m,i,j,k,T,x,t,f,mark,q;
scanf("%I64u",&T);
while(T--)
{
t=0;
mark=0;
f=0;
// memset(vis,0,sizeof(vis));
scanf("%I64u%I64u",&n,&m);
if(m%n!=0){
printf("-1\n");
continue;
}
if(n==1){
if(m==1)printf("0\n");
else printf("-1\n");
continue;
}
// printf("%I64u %I64u\n",n,m);
while(1)
{
// printf("1\n");
mark=0;
x=m/n;
if(x==1)break;
ll q=__gcd(x,n);
if(q>1){
n=n*q;
mark=1;t++;
}
if(mark==0){
f=1;break;
}
}
if(f)printf("-1\n");
else printf("%I64u\n",t);
}
}