来源:http://acm.hdu.edu.cn/contests/contest_showproblem.php?cid=843&pid=1003
Problem 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
思路:打表
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<set>
#include<algorithm>
using namespace std;
#define IOS ios_base::sync_with_stdio(0);cin.tie(0);
const int N = 150000 +2;
const int mod = 1000000007;
int a[N];
void init()
{
int n,t,cnt=0;
for(int i =1; cnt <=150000; i++)
{
n=i;
while(n!=1&&n!=4)
{
t=0;
while(n)
{
t+=(n%10)*(n%10);
n/=10;
}
n=t;
if(n==1)
a[cnt++]=i;
}
}
}
#define ll long long int
int main()
{
// freopen("C:\\Users\\nuoyanli\\Desktop\\acminput.txt","r",stdin);
// freopen("C:\\Users\\nuoyanli\\Desktop\\acminput.txt","r",stdout);
int x,num;
init();
IOS;cin>>num;
while(num--)
{
cin>>x;
if(x==1)
cout<<"1\n";
else
cout<<a[x-2]<<"\n";
}
return 0;
}