题意:
每次取一个六位数字的中间四位平方后取后六位,一直这样产生数字。
问什么时候开始循环。
分析:
按平方取尾法生成的序列,对每一个出现的六位数对其进行标记并记录位置。一旦出现重复即结束查找。
另:
由于是六位,由鸽巢原理,循环长度一定是在1百万以内的。
所以可以直接模拟就行了。
2183 | Accepted | 4616K | 0MS | G++ | 379B |
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
using namespace std;
int use[1000001];
int main(){
int x,y,i;
scanf("%d",&x);
memset(use,-1,sizeof(use));
use[x]=0;
for(i=1;;i++){
x=x/10%10000;
x*=x;
x%=1000000;
if(use[x]>=0)
break;
use[x]=i;
}
printf("%d %d %d\n",x,i-use[x],i);
return 0;
}