The Hendrie Sequence
题意
给定一段序列的生成方式,问第$n$个元素是多少。 $0
-
$H(1) = 0$
-
$H(n) = H(n-1)$中的每个元素$a_i$,那么每个元素就生成一个小子序列$0,0,0,0,0,a_i+1$其中$0$的个数是$a_i$。
-
除了第一个元素之外的所有元素都要进行这种变化
举个例子,
$H(1) = 0$
$H(2) =0,1$ //$0$变成了$0,1$
$H(4) = 0,1,0,2$ //$0$ 变成了$0,1$, $1$变成了$0,2$
$H(8) = 0,1,0,2,1,0,0,3$ //$0$ 变成了$0,1$, $1$变成了$0,2$ ,$2$变成了$0,0,3$
题解
找规律,我们可以发现每次都变化之后序列的长度都翻了一倍。所以我们单独把他增长的序列拿出来看。可以用心去发现这样一个规律。
-
定义增长的序列为$b_i$
-
$b_i$是由$1$个$b_{i-1}$,$2$个$b_{i-2}$,$3$个$b_{i-3}$,$4$个$b_{i-4}$…$i$个$b_{0}$ ,再加上一个单独的数字$i$。以此类推出来的。
那么我们就可以从第$n$个元素表示在它属于的那次增长中,它排第几个递归到最初的那几个元素中去,要判断一下范围。
由于题目中的数据比较极限,所以能用unsigned long long 还是用unsigned long long 吧。
如果用unsigned long long。一般数据量输入很小 可以用cin很靠谱。但是要把endl换成’\n’还有输入
1
2
std
cin
或者判断他是$2$的几次幂的时候可以这样子判断最高位的$1$在哪里。
1
2
3
4
ll n; int
ll temp = n;
while
dep--;
ac代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include
using
#define
#define
#define
#define
typedef
typedef
const
//head
ll n;
ll lie[10
ll solve
if
return
}
ll st = 0
rep(i,2
ll temp = pow
if
if
st += temp*(ll)(i-1
}
return
}
int
#ifdef
freopen("4.in"
#endif
std
cin
while
int
n--;
ll tn = n;
while
temp
[uva10479]The Hendrie Sqquence
https://www.cheasim.com/acm/2018/11/17/uva10479-The-Hendrie-Sqquence.html
作者
CheaSim
发布于
2018-11-17
更新于
2018-11-17
许可协议
#[递归](/tags/%E9%80%92%E5%BD%92/)[规律](/tags/%E8%A7%84%E5%BE%8B/)