您的位置:首页 > 其它

hdu5505GT and numbers

2016-05-10 13:16 211 查看
http://acm.hdu.edu.cn/showproblem.php?pid=5505

题意 给出 n ,m n每次可以成一个数(是n 的因子)问最少多少次乘到m

数据范围m是2^63 而longlong是2^63-1 开成unsigned ll,但是longlong存的话会把2^63存成-2^63,求得时候也没关系,恰好正确。

如果m的素因子中有n的素因子中没有的 肯定不存在 用gcd(n,m/n)判断,n每次乘完肯定还是n的倍数 要想最少次数,应该希望每次乘n

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;

typedef unsigned long long ull;

ull gcd(ull a,ull b)
{
if(!b)
return a;
else
return gcd(b,a%b);
}

int main()
{
int t;
scanf("%d",&t);
ull n,m,k;
while(t--)
{
int ans=0;
scanf("%lld%lld",&n,&m);
while(n!=m)
{
if(m%n)
{
printf("-1\n");
break;
}
k=gcd(m/n,n);
if(k==1)
{
printf("-1\n");
break;
}
n=n*k;
ans++;
}
if(n==m)
printf("%d\n",ans);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: