hdu 5505(GT and numbers)

本文探讨了一种解决特定数学问题的算法,通过优化步骤和逻辑,实现了从原始问题到解决方案的高效转换。该算法特别针对计算a变为b所需的最小操作次数,详细解释了从直接暴力方法到遵循题意的改进策略。

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

题意:

给你a和b,a每次和它的因子相乘得到一个新的a,求多少次后可以得到b。

输入样例
3
1 1
1 2
2 4
输出样例
0
-1
1

思路:

每次找出a和b/a的最大公约数(即当前a想得到b能乘的最大数),再进行判断。

第一次直接暴力搞,超时了,发现题意理解错了 T_T。

用unsign按着题意做即可。


#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <functional>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long ll;
typedef unsigned long long ull;

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

int main()
{
    int T;
    ull a,b;
    scanf("%d",&T);
    while(T--)
    {
        cin>>a>>b;
        if(a==1 && b==1)
        {
            printf("1\n");
            continue;
        }
        if(a==1 && b!=1)
        {
            printf("-1\n");
            continue;
        }
        ull ans = 0;
        while(b != a)
        {
            if(b % a)
            {
                printf("-1\n");
                break;
            }
            ull k = gcd(b/a,a);          //找能乘的最大因子
            if(k == 1)                   
            {
                printf("-1\n");
                break;
            }
            a*=k;
            ans++;
        }

        if(a == b)
            cout<<ans<<endl;
    }
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值