超级无敌简单题
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
21
2
Sample Output
17
题意
计算从1开始的第n个鸽子数。题解
我们用两个数组sum和vis,一个开150005,一个1005,先算前一千个数,标记是否为鸽子数,然后再while循环,找到150000个数即可,虽然是暴力但是时间完全够了93ms。#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#include<map>
#include<set>
#include<cstdlib>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=150005;
int sum[maxn],vis[1005];
int main(void)
{
memset(vis,0,sizeof(vis));
int n,m,num;
int k=1,i=2;
vis[1]=1;
sum[k++]=1;
while(i<=1000)
{
n=i;
while(n!=1&&n!=4)
{
num=0;
while(n) {
num+=((n%10)*(n%10));
n/=10;
}
n=num;
}
if(n==1) {
vis[i]=1;
sum[k++]=i;
}
i++;
}
while(k<=150000) {
num=0;
n=i;
while(n) {
num+=((n%10)*(n%10));
n/=10;
}
if(vis[num]) sum[k++]=i;
i++;
}
scanf("%d",&n);
while(n--) {
scanf("%d",&m);
printf("%d\n",sum[m]);
}
return 0;
}