数列

来源:互联网 发布:高智商犯罪 知乎 编辑:程序博客网 时间:2024/04/27 21:43

                                           讲解部分纯属来自一位大神,本人转载,代码为个人理解之后,敲的一个代码。

题目描述

给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是:

1,3,4,9,10,12,13,…

(该序列实际上就是:3^0,3^1,3^0+3^1,3^2,3^0+3^2,3^1+3^2,

3^0+3^1+3^2,…)

请你求出这个序列的第N项的值(用10进制数表示)。

例如,对于k=3,N=100,正确答案应该是981。

输入格式

输入只有1行,为2个正整数,用一个空格隔开:

k N

(k、N的含义与上述的问题描述一致,且3≤k≤15,10≤N≤1000)。

输出格式

输出为计算结果,是一个正整数(在所有的测试数据中,结果均不超过2.1*10^9)。(整数前不要有空格和其他符号)

思路如下   

     这一道题其实就是进制的转化,先把所有的N转化成2进制的形式,用数组存起来,数组下标就是对应的幂,然后用k的幂全部加起来

     比如100的二进制是1100100,那么这道题就是2^6+2^5+2^2 ,然后转化成k 就是k^6+k^5+k^2

      1,3,4,9,10,12,13,27,28,30… 这是k=3的时候 , 10是怎么来的,其实就是1+9 ,3+9 , 4+9,而9就是3^2,前面的数逐个跟k次幂相加得到的,k次幂前有多少个数,后面就有多少个数

      1 2 3 4 5 6 7 ... 这是k=2的时候,就更加容易发现了,5是由1+4,6是2+4 ,7是3+4

思考100 如何组成,其实就是64+32+4,64是第64个数,你会发现其实无论k怎么变,k次幂前的数都是成倍增加,所 以就是这个规律


代码如下

#include <iostream>#include <math.h>using namespace std;int a[105],index;int main(){    int k,x;    cin>>k>>x;    index =0;    while(x)    {        a[index++] = x%2;        x = x/2;    }    long long ans = 0;    for(int i = index-1; i>=0; i--)    {        if(a[i]==1)        {            int s = 1;            for(int j=0; j<i; j++)                s = s*k;            ans+=s;        }    }    cout<<ans<<endl;    return 0;}