hdu 5505(GT and numbers)

时间:2022-11-15 15:30:15

题意:

给你a和b,a每次和它的因子相乘得到一个新的a,求多少次后可以得到b。

输入样例
3
1 1
1 2
2 4
输出样例
0
-1
1

思路:

每次找出a和b/a的最大公约数(即当前a想得到b能乘的最大数),再进行判断。

第一次直接暴力搞,超时了,发现题意理解错了 T_T。

用unsign按着题意做即可。

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <functional>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long ll;
typedef unsigned long long ull; ull gcd(ull a,ull b)
{
if(a%b)
return gcd(b,a%b);
return b;
} int main()
{
int T;
ull a,b;
scanf("%d",&T);
while(T--)
{
cin>>a>>b;
if(a==1 && b==1)
{
printf("1\n");
continue;
}
if(a==1 && b!=1)
{
printf("-1\n");
continue;
}
ull ans = 0;
while(b != a)
{
if(b % a)
{
printf("-1\n");
break;
}
ull k = gcd(b/a,a); //找能乘的最大因子
if(k == 1)
{
printf("-1\n");
break;
}
a*=k;
ans++;
} if(a == b)
cout<<ans<<endl;
}
return 0;
}