HDU 5505 GT and numbers

13 篇文章 0 订阅

分析:给你2个数n,m,n每次都能乘以他的一个因子成为新的n,问你n至少乘多少次能够变成m,如果不能的话就输出-1。如果n能变成m话,m肯定是n的整数倍,初始的n乘以多个因子变成m,那么那些因子的乘积就是m/n,也就是n*(m/n)=m,所以每次都找到d=Gcd(n,m/n),然后n'=n*d,(m/n)'=(m/n)/d,直到n=m。如果d=1的话,n也不能变成m.这题的坑点就是1<=m<=2^63,要用无符号长整型来表示。

# include <stdio.h>
  unsigned long long Gcd(unsigned long long a,unsigned long long b)
  {
      return b?Gcd(b,a%b):a;
  }
  int main()
  {
      int t,ans;
      unsigned long long n,m,d;
      scanf("%d",&t);
      while(t--)
      {
          scanf("%I64u%I64u",&n,&m);
          if(n==m)
          {
              printf("0\n");
              continue;
          }
          if(m%n!=0)
          {
              printf("-1\n");
              continue;
          }
          m=m/n; ans=0;
          while(m!=1)
          {
              d=Gcd(n,m);
              n=n*d;
              m=m/d;
              ans++;
              if(d==1)
                break;
          }
          if(m!=1)
            printf("-1\n");
          else
            printf("%d\n",ans);
      }
      return 0;
  }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值