hdu 5505(数论-gcd的应用)

本文解析了GTandnumbers题目,给出了求解两数n、m间通过n不断乘以其约数达到m所需的最少步骤的方法。核心思想在于利用最大公约数进行倍数扩张。

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

GT and numbers

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1818    Accepted Submission(s): 490


Problem Description
You are given two numbers N and M.

Every step you can get a new N in the way that multiply N by a factor of N.

Work out how many steps can N be equal to M at least.

If N can't be to M forever,print 1.
 

 

Input
In the first line there is a number T.T is the test number.

In the next T lines there are two numbers N and M.

T1000, 1N1000000,1M263.

Be careful to the range of M.

You'd better print the enter in the last line when you hack others.

You'd better not print space in the last of each line when you hack others.
 

 

Output
For each test case,output an answer.
 

 

Sample Input
3 1 1 1 2 2 4
 

 

Sample Output
0 -1 1
 
题意:给出两个数 n,m ,n每次乘上某一个约数,问将 n->m 所需最少次数?
题解: n *(m/n) = m ,我们要让 n -> m,所以让n每次乘上最大的公约数,这是每次能够扩大的最大倍数,所以每次找到 d = gcd(n,m/n),n' = n*d ,(m/n)' = m/n/d,一直到 n==m ,当d = 1 时永远不可能到,break 输出 -1.
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
typedef unsigned long long ULL;
ULL n,m;
ULL gcd(ULL a,ULL b){
    return b==0?a:gcd(b,a%b);
}
int main(){
    int tcase;
    scanf("%d",&tcase);
    while(tcase--){
        scanf("%llu%llu",&n,&m);
        if(m%n!=0||n==1&&m!=1) {
            printf("-1\n");
            continue;
        }
        if(m==n) {
            printf("0\n");
            continue;
        }
        int ans = 0;
        ULL t = m/n;
        while(m!=n){
            ULL d = gcd(n,t);
            n = n*d;
            t = t/d;
            ans++;
            if(d==1) break;
        }
        if(m!=n) printf("-1\n");
        else printf("%d\n",ans);
    }
    return 0;
}

 

 

转载于:https://www.cnblogs.com/liyinggang/p/5810677.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值