题目意思:给定两个数字n和m,每次n都可以乘上一个自己的因子,求最少乘几次能得到m。
分析:
如果A大于B那么显然无解。
考虑把A和B分解质因数。
若B存在A没有的质因数也显然无解。
对于某一个A的质因数的次数。为了加速接近B,它一定是每次翻倍,最后一次的时候把剩下的加上。
那么答案就是最小的k使得2k∗Anum≥Bnum。
最后把每个质因数的答案max起来即可。(B可以是2^63,这样就得用unsigned long long了,这是个坑点)
PS:之前理解错了题目意思,以为每次乘上的都是给定的那个数字n的因子,其实不是,乘以的是每次乘以因子之后得到的数字的因子。#include <bits/stdc++.h>
using namespace std ;
int gcd(unsigned long long a , unsigned long long b)
{
if(a%b)
return gcd(b, a%b);
return b;
}
int main()
{
int t ;
unsigned long long m , n ;
scanf("%d",&t) ;
while(t--)
{
cin>>n>>m;
int ans = 0 ;
while(n!=m)
{
if(m%n){ printf("-1\n") ; break ; }
unsigned long long k = gcd(m/n,n) ;
if(k==1){ printf("-1\n") ; break ; }
n*=k ;//之前一直在这里写成m/=k了,wrong了无数次
ans++ ;
}
if(n==m)printf("%d\n",ans);
}
return 0 ;
}