数列(sequence)

来源:互联网 发布:微博域名怎么改 编辑:程序博客网 时间:2024/04/29 23:13
原文地址:数列(sequence)作者:_Dear_毒

【问题描述】

给定一个正整数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 zuGotha)保存着一份弥足珍贵的手稿,其标题为:

  “1与0,一切数字的神奇渊源。这是造物的秘密美妙的典范,因为,一切无非都来自上帝。”

  这是德国天才大师莱布尼茨(Gottfried Wilhelm Leibniz,1646 -1716)的手迹。但是,关于这个神奇美妙的数字系统,莱布尼茨只有几页异常精炼的描述。用现代人熟悉的话,我们可以对二进制作如下的解释:

  2^0 = 1
    2^1 = 2

    2^2 =4
    2^3 =8
    2^4 = 16

    2^5 =32
    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次方


    128
    +
    64
    +
    32
    +
    0
    +
    0
    +
    4
    +
    0
    +
    1
    =
   229

  在这个例子中,十进制的数字“229”就可以表述为二进制的“11100101”。任何一个二进制数字最左边的一位都是“1”。通过这个方法,用1到9和0这十个数字表述的整个自然数列都可用0和1两个数字来代替。0与1这两个数字很容易被电子化:有电流就是1;没有电流就是0。这就是整个现代计算机技术的根本秘密所在。>

 

 分析样例:

             3^0  3^1  3^2 3^3   ……

1(3^0):      1

2(3^1):         1

3(3^0+3^1):      1

4(3^2):              1

5(3^0+3^2):          1

6(3^1+3^2):          1

7(3^0+3^1+3^2):      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
             289 ……1

            2 44 ……0
            2 22 ……0

          2 11 ……1
            2 5 ……1
            2 2 ……0
             >
  

下面需要做的就是根据“0”、“1”计算出第n位上的数,即将二进制数转换为k进制数

   若第i个数上对应的是1,则tot:=tot+k^(i-1),若对应的是0,则跳过,相应代码如下

   ans:=0;
   for j:=1to i do
   begin
   t:=a[j];
    for m:=1toj-1 do
    t:=t*k;
   inc(ans,t);
   end;

【晒代码】

program sequence;
 var
   k,n,i,j,m,t,ans:longint;
   a:array[1..1000]oflongint;

 begin
 assign(input,'sequence.in');reset(input);
 assign(output,'sequence.out');rewrite(output);
  readln(k,n);
  fillchar(a,sizeof(a),0);
  i:=0;
  while n<>0do
   begin
   inc(i);
    a[i]:=n mod2;
    n:=n div2;
   end;
  ans:=0;
  for j:=1to i do
   begin
   t:=a[j];
    for m:=1toj-1 do
    t:=t*k;
   inc(ans,t);
   end;
  writeln(ans);
 close(input);close(output);
 end.

原创粉丝点击