题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6463
解题思路:
1.不是鸽子数,循环节长度为8,最多循环15次就能判断,可以直接暴力打表判断。
2.中间过程出现4了一定不是鸽子数。(可以加快点打表时间吧,不搞这个优化也不会超时-_-||)
代码:
#include<cstdio>
using namespace std;
typedef long long ll;
ll gz[150000+5];
void getst()
{
ll rnk = 1,cnt,now,ans;
for (ll i = 1;i<=1045000;i++){ ///1045000试出来的.
cnt = 0;
now = i;
while (cnt<=15){
cnt++;
ans = 0;
while (now){
ans += (now%10)*(now%10);
now/=10;
}
now = ans;
if (now == 1) break;
if (now == 4) cnt = 16;
}
if (cnt<=15) {
gz[rnk++] = i;
}
}
//printf("rank=%lld\n",rnk);
}
int main()
{
getst();
int q;
scanf("%d",&q);
while (q--){
int x;
scanf("%d",&x);
printf("%d\n",gz[x]);
}
return 0;
}