HDU GT and numbers (整数的唯一分解定理)

本文探讨了一种特殊的数论问题,即如何通过不断将一个数乘以其自身的因数来达到另一个目标数值。提供了详细的算法实现过程,包括输入输出示例,并针对特定条件给出了优化策略。

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


给出两个数NNMMNN每次可以乘上一个自己的因数变成新的NN。
求最初的NNMM至少需要几步。
如果永远也到不了输出-11
输入描述
第一行读入一个数TT表示数据组数。
接下来TT行,每行两个数NNMMT\leq1000T1000, 1\leq N \leq 10000001N1000000,1 \leq M \leq 2^{63}1M263.

注意M的范围。hack时建议输出最后一行的行末回车;每一行的结尾不要输出空格。
输出描述
对于每组数据,输出一个数表示答案。
输入样例
3
1 1
1 2
2 4
输出样例
0
-1
1

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
typedef unsigned long long ll;
int main()
{
    
    int t,i,j,ans,ok,temp;
    ll n,m;
    cin>>t;
    while(t--) {
        ok=0;
        ans=0;
        map<int,int>a;
        map<int,int>b;
        cin>>n>>m;
        if(n>m) {
            cout<<"-1"<<endl;
            continue;
        }
        for(i=2;i*i<=n;i++){
            while(n%i==0) {
                ++a[i];
                n/=i;
            }
        }
        if(n!=1) a[n]=1;
        for(i=2;(ll)i*i<=m;i++){
            if(m%i==0) {
                temp=0;
                 while(m%i==0) {
                     ++b[i];
                    m/=i;
                 }
                 if(a[i]==0 || a[i]>b[i]) {
                     ok=1;
                     break;
                 }
                 while(a[i]<b[i]) {
                     a[i]=a[i]*2;
                     temp++;
                 }
                 ans=max(ans,temp);
            }
            
        }
        if(m!=1) {
            b[m]=1;
            if(a[m]==0 || a[m]>b[m]) {
                ok=1;
            }
        }
        if(ok) cout<<"-1"<<endl;
        else cout<<ans<<endl;
        
    }
    return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值