广东工业大学第十四届程序设计竞赛 鸽子数

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

解题思路:

(1)这道题得先理解一下鸽子数的含义:从任何正整数开始,将数字替换为其各个数位的平方和,并重复该过程,直到该数字等于1。如果不能,则这个数字不是鸽子数。

(2)题目是将自然数从小到大排序,输出第k个鸽子数;

这道题可以先预处理,先将150000内的鸽子数先处理出来,才不用每次查询每次再循环一遍鸽子数,肯定会超时

注意:先将150000内的鸽子数先处理出来,这里特别要注意,不能从i = 1到 i = 150000 找鸽子数,因为该范围的鸽子数肯定小于150000(并不是所有的数都是鸽子数),所以应范围稍微大于150000;

代码如下:

 1 #include<iostream>
 2 using namespace std;
 3
 4
 5 int get(int tmp)          //将每个正整数分解成各位数的平方和;
 6  {
 7          int ans = 0;
 8         while (tmp>0)
 9      {
10             ans += (tmp% 10) * (tmp% 10);
11             tmp  = tmp/ 10;
12      }
13
14
15         return ans;
16  }
17  bool gezi(int n)
18 {
19      int temp = n;
20       while (1)
21    {
22           temp = get(temp);     //获得分解后的数,比如get(49)获得97(4²+9²);
23          if (temp == 2 ||temp == 3 ||temp == 4 ||temp == 5||temp == 6 || temp == 16 || temp == 20|| temp == 37 || temp == 42 || temp == 58 ||temp == 89 || temp == 145  )
24    {  //这个优化源于我一开始题目读错,以为是输入该数,判断是否为鸽子数,题目有2,结果2的分解是一个死循环,将2分解过程中的一个循环中的数都不会符合条件;再加上3,4,5,6,均不是鸽子数,因为题目说7是第二个鸽子数;
25                 return false;
26     } else
27          if (temp == 1)
28         {
29                 return true;
30         }
31     }
32 }
33
34
35 long long int count1 = 1;
36 long long int flag[1500005];
37 int q ,n;
38 int main()
39 {
40     cin>>q;
41     for( long long int i = 1 ;i <= 1050000;i++)   //这里不能只是到150000  因为这样的话找不到鸽子数范围到150000,范围得开再大点;
42     {
43         if(gezi(i))
44         {
45             flag[count1] = i;     //将鸽子数记录下来,并记录其序号,方便后面直接输出;
46             count1++;
47         }
48     }
49     for( int i = 0 ; i < q;i++)
50     {
51         cin>>n;
52         cout<<flag[n]<<endl;    //直接根据序号输出鸽子数;
53     }
54     return 0;
55 }
56
57
58  

原文地址:https://www.cnblogs.com/yewanting/p/10543792.html

时间: 2024-10-08 15:30:28

广东工业大学第十四届程序设计竞赛 鸽子数的相关文章

HDU 6467 简单数学题 【递推公式 &amp;&amp; O(1)优化乘法】(广东工业大学第十四届程序设计竞赛)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6467 简单数学题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 308    Accepted Submission(s): 150 Problem Description 已知 F(n)=∑i=1n(i×∑j=inCij) 求 F(n) m

(未完成)[HDUOJ]“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛

solved 5 A(签到) 题意:两个人随机得到0或1其中之一数字,每个人都可以猜对方的数字是什么,有一个人猜对就算成功,问最优策略下00,01,10,11四种情况两人的成功概率分别是多少. 题意不明的签到题,题面说两人不能沟通,以为就是两个人随便猜,成功率都是1-0.5*0.5=0.75.结果是两个人可以提前商量好策略,那显然可以其中一个人猜和自己相同的数,另一个人猜和自己不同的数,那么所有的成功率都是100%. #include<bits/stdc++.h> using namespac

2016年“计蒜客”杯华中师范大学第十四届程序设计竞赛题解

A. 寻找字符串 对于一个字符串 s,定义一个函数 S(x),表示 s 中有多少个子串 x.现在给定 S(a),S(b),S(ab),S(ba)的值,求满足这 4 个值的字符串 s,如果有多个满足条件的字符串,输出字典序最小的. s 中仅可能含有字符 a 和 b. 任何一个串的 S(ab) 与 S(ba) 的相差都不会超过1.可以分 S(ab)-S(ba) 为 0 -1 1 三种情况讨论.先构造出相应的 ab 相邻的串,再考虑按照字典序最小出要求将剩余的字母插入串中即可. 应该注意,这道问题有很

浙江财经大学第十四届程序设计竞赛题解

[题面pdf下载]链接: https://pan.baidu.com/s/1Eb16fHtNYMLrRk9QnXWa-g 密码: dwn8 [题目牛客网提交链接] [现场赛排名]链接: https://pan.baidu.com/s/1jfzH6-7BoPhEjnijGQK53w 密码: y669 感谢各位大佬的参赛.  由于命题人水平不高,而且之前没有命题经验,又是第一次把题目放到外网,所以可能会有数据不严谨的情况出现:也有可能出题人对问题理解不深刻,没想到最优解.如果发现了题目中的各种问题,

长春理工大学第十四届程序设计竞赛(重现赛)J.Printout

链接:https://ac.nowcoder.com/acm/contest/912/J 题意: 小r为了打校赛,他打算去打字社打印一份包含世界上所有算法的模板. 到了打字社,小r一看价格:总打印页数X0X0页以下(不含X0X0)x0x0元每页,X0∼X1X0∼X1页(不含X1X1)x1x1元每页,X1∼X2X1∼X2页(不含X2X2)x2x2元每页,X2∼X3X2∼X3页(不含X3X3)x3x3元每页,X3∼X4X3∼X4页(不含X4X4)x4x4元每页…… 小r转念一想,他可以多放一些白纸在

长春理工大学第十四届程序设计竞赛(重现赛)M.Orx Zone

链接:https://ac.nowcoder.com/acm/contest/912/M 题意: Daenerys Stormborn, 风暴中出生的丹尼莉丝,the Unburnt, 烧不死的,Queen of Meereen, 弥林女王,Queen of the Andals and the Rhoynar and the First Men, 安达尔人,罗伊那人,和先民的女王,Lord of the Seven Kingdoms, 七国之主,Protector of the Realm,

长春理工大学第十四届程序设计竞赛(重现赛)B

B Bowling Game 题目链接:https://ac.nowcoder.com/acm/contest/912/B 题目 CUST的队员打完省赛后,小r带着大家去打保龄球. 保龄球是一项难度非常高的游戏,然而这根本难不住校队成员,他们个个都很厉害(炸和)一发10个瓶都倒.尤其是小r,每次都能闭着眼睛一次扔倒10个瓶.他们当中也有一个并不那么厉害的下水道玩家,每次都能把球丢进下水道里,导致一个球瓶都砸不中. 几轮下来,我们发现回来的球越来越少,最后只剩几个9号球了.他们不爱丢9号球,因为太

长春理工大学第十四届程序设计竞赛(重现赛)H

H .Arithmetic Sequence 题目链接:https://ac.nowcoder.com/acm/contest/912/H 题目 数竞选手小r最喜欢做的题型是数列大题,并且每一道都能得到满分. 你可能不相信,但其实他发现了一个结论:只要是数列,无论是给了通项还是给了递推式,无论定义多复杂,都可以被搞成等差数列.这样,只要他精通了等差数列,他就能做出任何数列题目. 等差数列是数列的一种.在等差数列中,任何相邻两项的差相等,该差值称为公差.例如数列3,5,7,9,11,13,?就是一

长春理工大学第十四届程序设计竞赛(重现赛)F

F. Successione di Fixoracci 题目链接:https://ac.nowcoder.com/acm/contest/912/F 题目: 动态规划(Dynamic programming,简称dp)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法.例如,假设小x一步能爬1层或2层台阶,求小x爬n层台阶共有几种方法,就可以用dp计算:设Fi代表小x爬i层台阶共有几种方法,则Fi=Fi−1+Fi−2. 小x是练习时长两年半的acm练习生,喜欢口胡.dp.线段树.妙