这题主要学会了Floyd判圈法,以前判断循环用set检查,现在有了判圈法,复杂度低而且速度快。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <sstream>
#include <string>
#include <cmath>
#include <vector>
using namespace std;
int t;
int buf[100];
int next(int n,int k)//只是一个操作函数,不同的题不同的操作
{
if(!k) return 0;
long long k2=(long long )k*k;
int l=0;
while(k2>0)//数字每一位都存起来
{
buf[l++]=k2%10;
k2/=10;
}
if(n>l) n=l;
int ans=0;
for(int i=0;i<n;i++) ans=ans*10+buf[--l];//取前n位
return ans;
}
int main()
{
cin >> t;
while(t--)
{
int n,k;
cin >> n >> k;
int ans=k;
int k1=k,k2=k;
do
{
k1=next(n,k1);//第一个小孩,因为跑的慢,所以操作一次
k2=next(n,k2); if(k2>ans) ans=k2;//第二个小孩,跑得快,循环两次
k2=next(n,k2); if(k2>ans) ans=k2;
}while(k1 != k2);//相等表示慢的被套圈也就是所有的情况遍历了一遍了
cout << ans <<endl;
}
return 0;
}