hdu 5505 GT and numbers(数学规律)

本文解析了一道编程题——如何用最少步骤将一个数n通过乘以其因子的方式转换成另一个数m。文章分享了解题思路及注意事项,包括使用unsigned long long类型以避免溢出,并调用gcd函数简化代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5505

题目大意:

给一个数n和m,n能通过乘以自己的因子变到m。问最少需要多少步。

思路:

如果n能到m,那么需要乘上m/n。所以我们第一步就是算出x=gcd(n,m/m)。如果gcd不为1,然后n就变为x*n,此时到m,又需要乘上m/n,但这时的n已经变化了。所以我们就可以这样循环,直到n==m。如果中间过程中gcd变为1,那么表明一定达不到了。

注意一个trick:m可能为2^63,也就是说long long是达不到的,因为long long 的范围是2^63-1。这里要用unsigned long long 。

还有这里直接套用gcd函数即可,自己写的朴素判断会T。

代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#define ll unsigned __int64
using namespace std;
ll vis[1000005];
int main()
{
    ll n,m,i,j,k,T,x,t,f,mark,q;
    scanf("%I64u",&T);
    while(T--)
    {
        t=0;
        mark=0;
        f=0;
      //  memset(vis,0,sizeof(vis));
        scanf("%I64u%I64u",&n,&m);
        if(m%n!=0){
            printf("-1\n");
            continue;
        }
        if(n==1){
            if(m==1)printf("0\n");
            else printf("-1\n");
            continue;
        }

    //    printf("%I64u %I64u\n",n,m);
        while(1)
        {
           // printf("1\n");
           mark=0;
            x=m/n;
        if(x==1)break;
                 ll q=__gcd(x,n);
                 if(q>1){
                    n=n*q;
                    mark=1;t++;
                 }
                 if(mark==0){
                    f=1;break;
                 }



            }

     if(f)printf("-1\n");
        else printf("%I64u\n",t);
        }

    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值