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;
    }
    

      

     
  • 相关阅读:
    【转】微信中MMAlert(半透明底部弹出菜单)的使用介绍
    工厂模式
    装饰者模式
    观察者模式
    策略模式
    Android 自定义ViewGroup,实现侧方位滑动菜单
    【转】Android Android属性动画深入分析
    Android ActionBar仿微信界面
    书籍:《沧浪之水》、《盜墓筆記1-8全集》、《鬼 吹 灯(1-8加续)》、《流浪地球》、《二号首长1-5》
    FROM_UNIXTIME 格式化MYSQL时间戳函数
  • 原文地址:https://www.cnblogs.com/chengsheng/p/4892680.html
Copyright © 2011-2022 走看看