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 }
View Code

 

这个用floyd判圈法来做实在是太神奇了!

一个每回合next一次,另外一个每回合next两次;

直到他们相等;

虽然在next上多计算了几次;

但是在查询上就少了很多的空间和时间!

posted @ 2013-10-29 21:25  Yours1103  阅读(102)  评论(0编辑  收藏  举报