Alice got a hold of an old calculator that can display n digits. She was bored enough to come up with
the following time waster.
She enters a number k then repeatedly squares it until the result over
ows. When the result
over
ows, only the n most signi cant digits are displayed on the screen and an error
ag appears. Alice
can clear the error and continue squaring the displayed number. She got bored by this soon enough,
but wondered:
\Given n and k, what is the largest number I can get by wasting time in this manner?"
Input
The rst line of the input contains an integer t (1 t 200), the number of test cases. Each test case
contains two integers n (1 n 9) and k (0 k < 10n) where n is the number of digits this calculator
can display k is the starting number.
Output
For each test case, print the maximum number that Alice can get by repeatedly squaring the starting
number as described.
Sample Input
2
1 6
2 99
Sample Output
9
99
#include <iostream>
#include <stdio.h>
using namespace std;
int next(int n,int k)
{
long long k2 = (long long)k*k;
int buf[100],l=0,rt = 0;
while(k2 > 0)
{
buf[l++] = k2%10;
k2 /= 10;
}
//位数不够取最大
if(n>l)n=l;
//取n位
while(n--)
{
rt = rt*10 + buf[--l];
}
return rt;
}
int main()
{
int t, n, k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
int ans = k;
int k1 = k, k2 = k;
//每次会缩短两个之间一次操作
while(true)
{
k1 = next(n,k1);
k2 = next(n,k2);
ans = max(ans,k2);
k2 = next(n,k2);
ans = max(ans,k2);
if(k1 == k2)break;
}
printf("%d\n", ans);
}
return 0;
}