非常有意思的一个题目,暴力枚举的思路很好想,但是时间空间复杂度都很高,这时候就可以同时开启两条线路,增长率分别为1和2,当线路1和线路2再次相等时敲好走过了一个周期,在走这个周期的过程中维护最大值ans就可以了

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100;
int T, N, K, a[maxn];
int Next(int n, int k) {
if (!k) return 0;
long long kk = (long long)k * k;
int cnt = 0;
while (kk) {
a[cnt++] = kk % 10;
kk /= 10;
}
n = min(n, cnt);
int ans = 0;
for (int i = 0; i < n; i++) ans = ans * 10 + a[--cnt];
return ans;
}
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d %d", &N, &K);
int ans = K, k1 = K, k2 = K;
do {
k1 = Next(N, k1);
k2 = Next(N, k2); ans = max(ans, k2);
k2 = Next(N, k2); ans = max(ans, k2);
} while (k1 != k2);
printf("%d\n", ans);
}
return 0;
}