这个就是这么回事啊:那个,你就是找循环节中最大的那个就行了。。。
然后就是这么回事啦,还有就是注意,如果k*k爆了int要把其中一个转long long ,floyed判圈法。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int buf[110];
int next(int n, int k)
{
if(!k) return 0;
long long k2 = (long long)k * k;
int L = 0 ;
int ans = 0;
while(k2 > 0){
buf[L++] = k2 % 10;
k2 /= 10;
}
if(n > L) n = L;
for(int i = 0 ; i < n ; i++){
ans = ans * 10 + buf[--L];
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n , k;
scanf("%d %d", &n , &k);
int k1 = k , k2 = k , ans = k;
do{
k1 = next(n , k1);
k2 = next(n , k2);if(ans < k2) ans = k2;
k2 = next(n , k2);if(ans < k2) ans = k2;
}while(k1 != k2);
printf("%d\n",ans);
}
return 0;
}