zoukankan      html  css  js  c++  java
  • HDU 5505——GT and numbers——————【素数】

    GT and numbers

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


    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.

    T10001N1000000,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
     
    Source
     

    题目大意:

    解题思路:

    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    #include<iostream>
    #include<limits.h>
    using namespace std;
    typedef unsigned long long UINT;
    const int maxn = 1e6+2000;
    UINT prime[maxn];
    void getprime(){
        prime[0] = 1; prime[1] = 1;
        for(UINT i = 2; i*i <= maxn-10; i++){
            if(!prime[i])
            for(int j = i*i; j <= maxn-10 ;j += i){
                prime[j] = 1;
            }
        }
    }
    int main(){
        int T;
        getprime();
        scanf("%d",&T);
        UINT a,b;
        while(T--){
            scanf("%llu%llu",&a,&b);
            if(b < a){
                puts("-1");
            }else if(b == a){
                puts("0");
            }else{
                if(a == 1 || b%a != 0){
                    puts("-1");
                }else{
                    b /= a;
                    int sum = 0;
                    for(UINT i = 2; i <= maxn-100; i++){
                        if(prime[i]) continue;
                        UINT tmp = 1 , times = 0;
                        if(a % i != 0) continue;
                        while(a % i == 0){
                            a /= i;
                            tmp *= i;
                        }
                        while(b % tmp == 0){
                            b /= tmp;
                            tmp *= tmp;
                            times ++;
                        }
                        if(b % i == 0){
                            sum = times+1 > sum? times+1:sum;
                            while( b % i == 0){
                                b /= i;
                            }
                        }else{
                            sum = times > sum? times:sum;
                        }
                        if(b == 1){
                            break;
                        }
                    }
                    if(b == 1){
                        printf("%d
    ",sum);
                    }else{
                        puts("-1");
                    }
                }
            }
        }
        return 0;
    }
    

      

     
  • 相关阅读:
    [BZOJ3195] [Jxoi2012]奇怪的道路
    Splay Tree
    区间DP复习
    Link Cut Tree
    [BZOJ2734] [HNOI2012]集合选数
    如何写出杀手级简历(针对程序员) (转)
    30个提高Web程序执行效率的好经验(转)
    Oracle中的SQL跟踪( 转)
    如何终止SQL Server中的用户进程(转)
    Will the real programmers please stand up?(转)
  • 原文地址:https://www.cnblogs.com/chengsheng/p/4892680.html
Copyright © 2011-2022 走看看