hdu 5505

来源:互联网 发布:angular ui router.js 编辑:程序博客网 时间:2024/05/16 15:01

题目意思:给定两个数字n和m,每次n都可以乘上一个自己的因子,求最少乘几次能得到m。

分析:

如果AAA大于BBB那么显然无解。

考虑把AAABBB分解质因数。

BBB存在AAA没有的质因数也显然无解。

对于某一个AAA的质因数的次数。为了加速接近BBB,它一定是每次翻倍,最后一次的时候把剩下的加上。

那么答案就是最小的kkk使得2k∗Anum≥Bnum2^{k}*A_{num} \geq B_{num}2kAnumBnum

最后把每个质因数的答案max起来即可。(B可以是2^63,这样就得用unsigned long long了,这是个坑点)

PS:之前理解错了题目意思,以为每次乘上的都是给定的那个数字n的因子,其实不是,乘以的是每次乘以因子之后得到的数字的因子。

#include <bits/stdc++.h>using namespace std ;int gcd(unsigned long long a , unsigned long long b){    if(a%b)        return gcd(b, a%b);    return b;}int main(){    int t ;    unsigned long long m , n ;    scanf("%d",&t) ;    while(t--)    {        cin>>n>>m;        int ans = 0 ;        while(n!=m)        {            if(m%n){ printf("-1\n") ; break ; }            unsigned long long k = gcd(m/n,n) ;            if(k==1){ printf("-1\n") ; break ; }            n*=k ;//之前一直在这里写成m/=k了,wrong了无数次            ans++ ;        }        if(n==m)printf("%d\n",ans);    }    return 0 ;}


0 0
原创粉丝点击