#include<bits/stdc++.h>
using namespace std;
/*
STL too slow
int next(int n,int k){
stringstream ss;
ss<<(long long)k*k;//Note Overflow
string s = ss.str();
if(s.length()>n) s=s.substr(0,n);
int ans;
stringstream ss2(s);
ss2>>ans;
return ans;
}
4.5 second
*/
//room big
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];
return ans;
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
int n,k;
scanf("%d%d",&n,&k);
set<int> s;
int ans=k;
while(!s.count(k)){
s.insert(k);
if(k>ans) ans=k;
k=next(n,k);
}
printf("%d\n",ans);
}
return 0;
}
还可以优化成Floyd判圈算法
int ans=k;
int k1=k,k2=k;
do{
k1=next(n,k1);//kid_1
k2=next(n,k2); if(k2 > ans) ans=k2;//kid_2 first step
k2=next(n,k2); if(k2 > ans) ans=k2;//second step
}while(k1!=k2); //when catch then stop
算法思想:2个小孩,一个的速度是另一个的2倍,如果有环,跑的快的会追上跑的慢的,这样快速的判环
而且本题是一定会出现环的,毕竟n是很有限的,最大的范围也就是999999999
#include<bits/stdc++.h>
using namespace std;
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];
return ans;
}
int main()
{
int T;
cin>>T;
while(T--){
int n,k;
cin>>n>>k;
int ans=k;
int k1=k,k2=k;
do{
k1=next(n,k1);//kid_1
k2=next(n,k2); if(k2 > ans) ans=k2;//kid_2 first step
k2=next(n,k2); if(k2 > ans) ans=k2;//second step
}while(k1!=k2); //when catch then stop
cout<<ans<<endl;
}
return 0;
}