UVA11549 计算机谜题(Floyd判圈算法)

时间:2023-03-09 05:59:51
UVA11549 计算机谜题(Floyd判圈算法)
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<sstream>
using namespace std;
/*int next1(int n,int k)
{
stringstream ss;
ss<<(long long)k*k;
string s=ss.str();
if(s.length()>n)s=s.substr(0,n);//结果太长,只取前n位
int ans;
stringstream ss2(s);
ss2>>ans;
return ans;
}*/
int buf[];
int next2(int n,int k)
{
if(!k) return ;
long long k2=(long long)k*k;
int L=;
while(k2>){
buf[L++]=k2%;k2/=;
}
if(n>L)n=L;
int ans=;
for(int i=;i<n;i++)
ans=ans*+buf[--L];//把前min{n,L}位重新组合
return ans;
}
/*int main()
{
int T;
cin>>T;
while(T--)
{
int n,k;
cin>>n>>k;
set<int>s;
int ans=k;
while(!s.count(k))
{
s.insert(k);
if(k>ans)ans=k;
k=next1(n,k);
}
cout<<ans<<endl;
}
return 0;
}
*/
int main()
{
int T;
cin>>T;
while(T--)
{
int n,k;
cin>>n>>k;
int ans=k;
int k1=k;int k2=k;
do{
k1=next2(n,k1);
k2=next2(n,k2);if(k2>ans)ans=k2;
k2=next2(n,k2);if(k2>ans)ans=k2;
}while(k1!=k2);
cout<<ans<<endl;
}
return ;
}

假设有两个小孩在一个“可以无限向前跑”的环形跑道上赛跑,同时出发,但其中一个小孩的速度是另一个小孩的速度的2倍,那么跑的快的小孩将追上跑的慢的小孩,

注释掉的代码的时间要更长next1要4秒多,next2要1秒。