Description
通常来说,题面短的题目一般都比较难,所以我要把题面写得很长很长。
通常来说,题面短的题目一般都比较难,所以我要把题面写得很长很长。
通常来说,题面短的题目一般都比较难,所以我要把题面写得很长很长。
鸽子数字由以下过程定义:从任何正整数开始,将数字替换为其各个数位的平方和,并重复该过程,直到该数字等于1。如果不能,则这个数字不是鸽子数。
例如7是鸽子数,因为7->49->97->130->10->1。(7*7=49,4*4+9*9=97,9*9+7*7=130....如此类推)
显然1是第一个鸽子数。
有Q个询问,每个询问给出一个数k,你需要输出第k个鸽子数。
Input
第一行一个Q,代表询问的个数(Q<=100000)
接下来Q行,每行一个数字k(k<150000)
Output
每行输出一个数,代表第k个鸽子数
Sample Input
2 1 2
Sample Output
1 7
题解:
将每一次的sum结果,保存在数组a中,一旦某一次的结果和a中的数据有重复, 便可判断为不是“鸽子数”。
代码如下:
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<queue>
#include<map>
#include<set>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define swap(a,b) (a=a+b,b=a-b,a=a-b)
#define maxn 100007
#define N 100000000
#define INF 0x3f3f3f3f
#define mod 1001113
#define e 2.718281828459045
#define eps 1.0e18
#define PI acos(-1)
#define lowbit(x) (x&(-x))
#define read(x) scanf("%d",&x)
#define put(x) prllf("%d\n",x)
#define memset(x,y) memset(x,y,sizeof(x))
#define Debug(x) cout<<x<<" "<<endl
#define lson i << 1,l,m
#define rson i << 1 | 1,m + 1,r
#define ll long long
//std::ios::sync_with_stdio(false);
//cin.tie(NULL);
//const int maxn=;
using namespace std;
int a[100000000],b[150000];
void init()
{
int m=0;
for(int i=0; i<1500000; i++)
{
int sum=0,cnt=0,s=i;
while(1)
{
int k=s%10,flag=0;
sum+=k*k;
s/=10;
if(s==0)
{
if(sum==1)
{
b[m++]=i;
break;
}
else
{
for(int i=0; i<cnt; i++)
{
if(a[i]==sum)
{
flag=1;
break;
}
}
if(flag)
break;
else
{
a[cnt]=sum;
s=sum;
sum=0;
cnt++;
}
}
}
}
}
}
int main()
{
init();
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
cout<<b[n-1]<<endl;
}
return 0;
}