zoukankan      html  css  js  c++  java
  • ACM HDU 3353 Not So Flat After All(简单题)

    Not So Flat After All

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 517    Accepted Submission(s): 209


    Problem Description
    Any positive integer v can be written as p1 a1 * p2 a2 * . . . pnan where pi is a prime number and ai >= 0. For example: 24 = 23 * 31.
    Pick any two prime numbers p1 and p2 where p1 <> p2. Imagine a two dimensional plane where the powers of p1 are plotted on the x-axis and the powers of p2 on the yaxis. Now any number that can be written as p1 a1 * p2 a2 can be plotted on this plane at location (x, y) = (a1, a2). The figure on the right shows few examples where p1 = 3 and p2 = 2.


    This idea can be extended for any N-Dimensional space where each of the N axes is assigned a unique prime number. Each N-Dimensional space has a unique set of primes. We call such set the Space Identification Set or S for short. |S| (the ordinal of S) is N.
    Any number that can be expressed as a multiplication of pi S (each raised to a power (ai >= 0) can be plotted in this |S|-Dimensional space. The figure at the bottom illustrates this idea for N = 3 and S = {2, 3, 7}. Needless to say, any number that can be plotted on space A can also be plotted on space B as long as SA SB.
    We define the distance between any two points in a given N-Dimensional space to be the sum of units traveled to get from one point to the other while following the grid lines (i.e. movement is always parallel to one of the axes.) For example, in the figure below, the distance between 168 and 882 is 4.
    Given two positive integers, write a program that determines the minimum ordinal of a space where both numbers can be plotted in. The program also determines the distance between these two integers in that space.
     

    Input
    Your program will be tested on one or more test cases. Each test case is specified on a line with two positive integers (0 < A,B < 1, 000, 000) where A * B > 1.
    The last line is made of two zeros.
     

    Output
    For each test case, print the following line:
    k. X:D
    Where k is the test case number (starting at one,) X is the minimum ordinal needed in a space that both A and B can be plotted in. D is the distance between these two points.
    Note: There is a blank space before X.
     

    Sample Input
    168 882 770 792 0 0
     

    Sample Output
    1. 3:4 2. 5:6
     

    Source
     

    Recommend
    lcy
     
     
    #include<stdio.h>
    #include
    <math.h>
    #include
    <iostream>
    #include
    <string.h>
    using namespace std;
    #define MAXN 1000000
    int prime[MAXN],num;
    bool notprime[MAXN];
    int pa[MAXN],ma[MAXN];
    int pb[MAXN],mb[MAXN];
    void PRIME()
    {
    int i,j;
    num
    =0;
    memset(notprime,
    false,sizeof(notprime));
    for(i=2;i<MAXN;i++)
    if(!notprime[i])
    {
    prime[num
    ++]=i;
    for(j=i+i;j<MAXN;j+=i)
    notprime[j]
    =true;
    }
    }
    int main()
    {
    int a,b;
    int na,nb;
    int i,j,t;
    int iCase=0;
    PRIME();
    while(scanf("%d%d",&a,&b))
    {
    if(a==0&&b==0) break;
    iCase
    ++;
    na
    =nb=0;
    for(i=0;i<num&&a>0;i++)
    {
    if(a%prime[i]==0)
    {
    t
    =0;
    while(a%prime[i]==0)
    {
    t
    ++;
    a
    /=prime[i];
    }
    pa[na]
    =prime[i];
    ma[na
    ++]=t;
    }
    }
    for(i=0;i<num&&b>0;i++)
    {
    if(b%prime[i]==0)
    {
    t
    =0;
    while(b%prime[i]==0)
    {
    t
    ++;
    b
    /=prime[i];
    }
    pb[nb]
    =prime[i];
    mb[nb
    ++]=t;
    }
    }
    int X=0,D=0;
    i
    =0;j=0;
    while(i<na&&j<nb)
    {
    if(pa[i]==pb[j])
    {
    X
    ++;
    D
    +=abs(ma[i]-mb[j]);
    i
    ++;
    j
    ++;
    }
    else if(pa[i]<pb[j])
    {
    X
    ++;
    D
    +=ma[i];
    i
    ++;
    }
    else
    {
    X
    ++;
    D
    +=mb[j];
    j
    ++;
    }
    }
    while(i==na&&j<nb)
    {
    X
    ++;
    D
    +=mb[j];
    j
    ++;
    }
    while(i<na&&j==nb)
    {
    X
    ++;
    D
    +=ma[i];
    i
    ++;
    }
    printf(
    "%d. %d:%d\n",iCase,X,D);
    }
    return 0;
    }

  • 相关阅读:
    python+fiddler 抓取抖音数据包并下载抖音视频
    fiddler抓包+安卓机 完成手机app抓包的配置 遇到的一些问题
    Mobileye独创性创新
    EyeQ进展The Evolution of EyeQ
    Mobileye高级驾驶辅助系统(ADAS)
    重型车辆盲区行为检查Behaviours – Heavy Vehicle Blind Spots
    Xilinx低比特率高品质 ABR 视频实时转码(HPE 参考架构)
    Xilinx FPGA全局介绍
    用NumPy genfromtxt导入数据
    如何在Python中加速信号处理
  • 原文地址:https://www.cnblogs.com/kuangbin/p/2155667.html
Copyright © 2011-2022 走看看