数列(sequence) 的二进制应用
【问题描述】
给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是:
1,3,4,9,10,12,13,…
(该序列实际上就是:30,31,30+31,32,30+32,31+32,30+31+32,…)
请你求出这个序列的第N项的值(用10进制数表示)。
例如,对于k=3,N=100,正确答案应该是981。
【输入文件】
输入文件sequence.in 只有1行,为2个正整数,用一个空格隔开:
k N
(k、N的含义与上述的问题描述一致,且3≤k≤15,10≤N≤1000)。
【输出文件】
输出文件sequence.out 为计算结果,是一个正整数(在所有的测试数据中,结果均不超过2.1*109)。(整数前不要有空格和其他符号)。
【输入样例】
3 100
【输出样例】
981
【解题过程】
______二进制解题
初次见到这题、很囧,因为据说它涉及到二进制的东东,而我对于进制转换这东西是最迷糊的,所以我费了整整一个下午来搞它。
首先、进制转换的东西是必须知道的
下面是从百度百科上copy的关于二进制的某些东东___突然感觉我很佩服莱布尼茨
<在德国图灵根著名的郭塔王宫图书馆(Schlossbiliothke zu Gotha)保存着一份弥足珍贵的手稿,其标题为:
“1与0,一切数字的神奇渊源。这是造物的秘密美妙的典范,因为,一切无非都来自上帝。”
这是德国天才大师莱布尼茨(Gottfried Wilhelm Leibniz,1646 - 1716)的手迹。但是,关于这个神奇美妙的数字系统,莱布尼茨只有几页异常精炼的描述。用现代人熟悉的话,我们可以对二进制作如下的解释:
2^0 = 1
2^1 = 2
2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16
2^3 = 8
2^4 = 16
2^5 = 32
2^6 = 64
2^7 = 128
2^6 = 64
2^7 = 128
以此类推。
把等号右边的数字相加,就可以获得任意一个自然数。我们只需要说明:采用了2的几次方,而舍掉了2几次方。二进制的表述序列都从右边开始,第一位是2的0次方,第二位是2的1次方,第三位时2的2次方……,以此类推。一切采用2的成方的位置,我们就用“1”来标志,一切舍掉2的成方的位置,我们就用“0”来标志。这样,我们就得到了下边这个序列:
1 1 1 0 0 1 0 1
2的7次方
2的6次方
2的5次方
0
0
2的2次方
0
2的0次方
2的6次方
2的5次方
0
0
2的2次方
0
2的0次方
128
+
64
+
32
+
0
+
0
+
4
+
0
+
1
=
229
在这个例子中,十进制的数字“229”就可以表述为二进制的“11100101”。任何一个二进制数字最左边的一位都是“1”。通过这个方法,用1到9和0这十个数字表述的整个自然数列都可用0和1两个数字来代替。0与1这两个数字很容易被电子化:有电流就是1;没有电流就是0。这就是整个现代计算机技术的根本秘密所在。>
分析样例:
n 3^0 3^1 3^2 3^3 ……
1(3^0): 1
2(3^1): 0 1
3(3^0+3^1): 1 1
4 (3^2): 0 0 1
5 (3^0+3^2): 1 0 1
6 (3^1+3^2): 0 1 1
7 (3^0+3^1+3^2): 1 1 1
. . . . .
. . . . .
. . . . .
由上面的分析可知,我们可以把第n个数看做3^0、3^1、3^2……这些数的和的形式,那么到底是3^0、3^1、3^2……中的那些数的和呢,我们用0、1来表示:0——没有对应数,1——有对应数。怎么得到相应的“0”和“1”呢?这就用到了十进制转换为二进制
<十进制转二进制
· 十进制整数转二进制数:“除以2取余,逆序排列”(除二取余法)
例: (89)10 =(1011001)2
2 89 ……1
例: (89)10 =(1011001)2
2 89 ……1
2 44 ……0
2 22 ……0
2 22 ……0
2 11 ……1
2 5 ……1
2 2 ……0
1 >
2 5 ……1
2 2 ……0
1 >
转载于:https://blog.51cto.com/clemily/524018