看的大神的代码。。。
思路是,读入n,m,若m能整除n,求m / n与n的最大公约数(通过最大公约数这个因子n增长最快,用的次数最少),如果是1,说明和n互质,不可能完成。
如果最大公约数不是1,则n乘以这个最大公约数,开始迭代。
若刚开始m就不能整除n,则不可能完成。
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <ctype.h>
#include <iostream>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <math.h>
#define ULL unsigned long long
using namespace std;
ULL gcd(ULL a, ULL b) {
if (a % b) {
return gcd(b, a % b);
} else {
return b;
}
}
int main()
{
int T, ans;
ULL m, n;
while (~scanf("%d", &T)) {
while (T--) {
ans = 0;
scanf("%I64u%I64u", &n, &m);
while (m != n) {
if (m % n) {
puts("-1");
break;
}
ULL k = gcd(m / n, n);
if (k == 1) {
puts("-1");
break;
}
n *= k;
ans++;
}
if (m == n) {
printf("%d\n", ans);
}
}
}
return 0;
}