本题难点在于判断是否存在循环,一种可行方法是使用STL中的set,但是空间开销有点大,同事set的插入和查找也花费
一定时间,这里使用最基本的追击问题原理,可以在常数开销下解决循环判断问题。
如果两个速度不同的人在圆形跑道上同时同起点跑,则两人必定会再相遇。基于此,
对于每个k,使用另外两个与之相同的变量,称为k1、k2,k1每次只计算一次平方,k2每次计算两次平方,这样k1和k2总有
相等的一次,至此算法停止。具体如下:
next(int n, int k) //对k,计算屏幕出现的数字k的平方的高n位
int main()
{
int t;
cin >> t;
while ( t -- )
{
int n, k;
cin >> n >> k;
int k1 = k2 = k;
int ans = 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)
cout << ans << endl;
}
return 0;
}