uva 11549 - Calculator Conundrum
简单题;
1 #include<cstdio> 2 #include<set> 3 using namespace std; 4 int t,n,k; 5 set<int>s; 6 int wei[20]; 7 void next() 8 { 9 if(k==0)return; 10 long long kk=(long long)k*k; 11 k=0; 12 int cnt=0; 13 while(kk>0) 14 { 15 wei[cnt++]=kk%10; 16 kk/=10; 17 } 18 for(int i=0;i<n;i++) 19 k=k*10+wei[--cnt]; 20 } 21 22 int main() 23 { 24 25 scanf("%d",&t); 26 while(t--) 27 { 28 s.clear(); 29 scanf("%d%d",&n,&k); 30 int ans=k; 31 while(!s.count(k)) 32 { 33 s.insert(k); 34 ans=max(ans,k); 35 next(); 36 } 37 printf("%d\n",ans); 38 } 39 return 0; 40 }
这个用floyd判圈法来做实在是太神奇了!
一个每回合next一次,另外一个每回合next两次;
直到他们相等;
虽然在next上多计算了几次;
但是在查询上就少了很多的空间和时间!