[Floyd判圈]Calculator Conumdrum

Problem C

CALCULATOR CONUNDRUM

Alice got a hold of an old calculator that can displayn digits. She was bored enough to come up with the following time waster.

She enters a numberk then repeatedly squares it until the result overflows. When the result overflows, only then most significant digits are displayed on the screen and an error flag appears. Alice can clear the error and continue squaring the displayed number. She got bored by this soon enough, but wondered:

“Givenn and k, what is the largest number I can get by wasting time in this manner?”

Program Input

The first line of the input contains an integer t (1 ≤ t ≤ 200), the number of test cases. Each test case contains two integersn (1 ≤ n ≤ 9) and k (0 ≤ k < 10n) wheren is the number of digits this calculator can display k is the starting number.

Program Output

For each test case, print the maximum number that Alice can get by repeatedly squaring the starting number as described.

Sample Input & Output

INPUT

 
  OUTPUT 
  
9
99

Calgary Collegiate Programming Contest 2008


题目暗示了会出现循环。

这是一个很巧妙的思路,两个进程执行相同任务,使之一快一慢,如果确定存在环,那么快的一定会追上慢的,这个算法甚至不用开hash。是一个相当简便的方法,时间效率有待考证。

#include 

int n,k;
int bit;

int max(int a,int b)
{
    if (a > b)
        return a;
    return b;
}

void next(int& a)
{
    long long b = a;
    b = b*b;
    while (b > bit)
        b /= 10;
    a = b;
    //printf("a = %d\n",a);
}

int p10(int a)
{
    int rs = 1;
    for (int i=1;i<=a;i++)
        rs *= 10;
    return rs;
}

int main()
{
    //freopen("cc.in","r",stdin);
    //freopen("cc.out","w",stdout);

    int T;
    scanf("%d",&T);
    for (int tt=1;tt<=T;tt++)
    {
        scanf("%d%d",&n,&k);
        int n1 = k;
        int n2 = k;
        bit = p10(n)-1;
        int ans = k;
        do
        {
            next(n1);
            next(n2);
            //printf("n2 = %d\n",n2);
            ans = max(ans,n2);
            next(n2);
            //printf("n2 = %d\n",n2);
            ans = max(ans,n2);
        }while (n1 != n2);
        printf("%d\n",ans);
    }

    return 0;
}



你可能感兴趣的:(ACM)