標籤:代碼 code 無限 ext 組合 span count div mat
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #include<set> 7 #include<sstream> 8 using namespace std; 9 /*int next1(int n,int k)10 {11 stringstream ss;12 ss<<(long long)k*k;13 string s=ss.str();14 if(s.length()>n)s=s.substr(0,n);//結果太長,只取前n位15 int ans;16 stringstream ss2(s);17 ss2>>ans;18 return ans;19 }*/20 int buf[100];21 int next2(int n,int k)22 {23 if(!k) return 0;24 long long k2=(long long)k*k;25 int L=0;26 while(k2>0){27 buf[L++]=k2%10;k2/=10;28 }29 if(n>L)n=L;30 int ans=0;31 for(int i=0;i<n;i++)32 ans=ans*10+buf[--L];//把前min{n,L}位重新組合33 return ans;34 }35 /*int main()36 {37 int T;38 cin>>T;39 while(T--)40 {41 int n,k;42 cin>>n>>k;43 set<int>s;44 int ans=k;45 while(!s.count(k))46 {47 s.insert(k);48 if(k>ans)ans=k;49 k=next1(n,k);50 }51 cout<<ans<<endl;52 }53 return 0;54 }55 */56 int main()57 {58 int T;59 cin>>T;60 while(T--)61 {62 int n,k;63 cin>>n>>k;64 int ans=k;65 int k1=k;int k2=k;66 do{67 k1=next2(n,k1);68 k2=next2(n,k2);if(k2>ans)ans=k2;69 k2=next2(n,k2);if(k2>ans)ans=k2;70 }while(k1!=k2);71 cout<<ans<<endl;72 }73 return 0;74 }
假設有兩個小孩在一個“可以無限向前跑”的環形跑道上賽跑,同時出發,但其中一個小孩的速度是另一個小孩的速度的2倍,那麼跑的快的小孩將追上跑的慢的小孩,
注釋掉的代碼的時間要更長next1要4秒多,next2要1秒。
UVA11549 電腦謎題(Floyd判圈演算法)