有一个计算器,每次输入两个数n,k,n代表着最多能够显示n位数,k代表从k开始取k得平方,如果超过了n位数,就取最高的n位数,然后接着取平方。问这些数中最大的是多少。
这些数肯定会进入一个循环,那么只需要判断循环就好了,可以直接用set存入,看这些数有没有出现过。也可以循环一定的次数,比如1e5次,每次把得到的数加入一个数组中,最后排序。但是这需要循环足够的次数,否则会错。有一定运气成分。
#pragma warning(disable:4996)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<set>
#include<algorithm>
#include<cmath>
#include<climits>
using namespace std;
typedef long long ll;
const int maxn = 10005;
ll a[maxn], MAX;
ll getnext(ll k)
{
ll i, t;
t = k * k;
while (t > MAX)
{
t /= 10;
}
return t;
}
int main()
{
ll i, temp, ans, n, k, T, k1, k2;
scanf("%lld", &T);
while (T--)
{
scanf("%lld%lld", &n, &k);
//MAX是能取的最大值
MAX = 9;
for (i = 1; i < n; i++)
MAX = MAX * 10 + 9;
ans = k; k1 = k; k2 = k;//floyd判圈法
do
{
k1 = getnext(k1);
k2 = getnext(k2); if (ans < k2)ans = k2;
k2 = getnext(k2); if (ans < k2)ans = k2;
} while (k1 != k2);
printf("%lld\n", ans);
}
return 0;
}